相关疑难解决方法(0)

使用printf打印UTF-8字符串 - 宽字符串与多字节字符串文字

在这些语句中,两者都使用相同的编码(UTF-8)输入到源代码中并且语言环境设置正确,它们之间是否存在实际差异?

printf("? ??????????? ?? ???? ?????\n");
printf("%ls", L"? ??????????? ?? ???? ?????\n");
Run Code Online (Sandbox Code Playgroud)

因此有什么理由在做输出时更喜欢一个而不是另一个?我想第二个表现得差一点,但是它对多字节文字有任何优势(或劣势)吗?

编辑:这些字符串打印没有问题.但是我没有使用宽字符串函数,因为我也希望能够使用printf等等.所以问题是打印任何不同的方式(鉴于上面列出的情况),如果是这样,第二个方法有任何优势吗?

编辑2:按照下面的评论,我现在知道这个程序有效 - 我认为这是不可能的:

int main()
{
    setlocale(LC_ALL, "");
    wprintf(L"? ??????????? ?? ???? ?????\n");  // wide output
    freopen(NULL, "w", stdout);                 // lets me switch
    printf("? ??????????? ?? ???? ?????\n");    // byte output
}
Run Code Online (Sandbox Code Playgroud)

EDIT3:我通过观察这两种类型的情况做了一些进一步的研究.拿一个更简单的字符串:

wchar_t *wides = L"£100 ?";
char *mbs = "£100 ?";
Run Code Online (Sandbox Code Playgroud)

编译器生成不同的代码.宽字符串是:

.string "\243"
.string ""
.string ""
.string "1"
.string ""
.string ""
.string "0"
.string ""
.string ""
.string …
Run Code Online (Sandbox Code Playgroud)

c unicode printf utf-8 multibyte

21
推荐指数
1
解决办法
6万
查看次数

将 Powershell.exe 的输入和输出重定向到 C++ 中的管道

我正在尝试在 C++ 中执行 powershell 命令并通过管道获取其输出。

我的程序非常适合 cmd.exe。但是,当我尝试用 powershell.exe 做同样的事情时,我只得到“W”作为输出。

我已经注释了下面代码中需要修改以执行 powershell.exe 的行 下面是我的适用于 cmd.exe 的代码:

        HANDLE stdinRd, stdinWr, stdoutRd, stdoutWr;
        DWORD readFromCmd();
        DWORD writeToCmd(CString command);
        int main(int argc,char* argv[])
        {
            SECURITY_ATTRIBUTES sa={sizeof(SECURITY_ATTRIBUTES), NULL, true};
            if(!CreatePipe(&stdinRd, &stdinWr, &sa, 1000000) || !CreatePipe(&stdoutRd,&stdoutWr, &sa, 1000000)) 
            {
                printf("CreatePipe()");
            }
            STARTUPINFO si;
            PROCESS_INFORMATION pi;
            GetStartupInfo(&si);
            si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
            si.wShowWindow = SW_HIDE;
            si.hStdOutput = stdoutWr;
            si.hStdError = stdoutWr;                  
            si.hStdInput = stdinRd; 

    // If powershell.exe is invoked, it does not work, however works for cmd.exe …
Run Code Online (Sandbox Code Playgroud)

c++ powershell winapi pipe named-pipes

5
推荐指数
1
解决办法
2115
查看次数

Linux上的wprintf UTF16(应该是UTF8)?

1 wprintf将'Ω'显示为3A9(UTF16),但wctomb将wchar转换为CEA9(UTF8),我的语言环境默认为en_US.utf8,这真的很奇怪.正如man-pages所说,它们应该符合我的语言环境,但wpritnf使用UTF16,为什么?

摘自http://www.fileformat.info/info/unicode/char/3a9/index.htm

Ω为UTF

UTF-8(十六进制)0xCE 0xA9(cea9)

UTF-16(十六进制)0x03A9(03a9)

2 wprintf和printf只是无法在同一程序中运行,我必须选择使用wprintf或printf,为什么?


看我的计划:

#include <stdio.h>
#include <wchar.h>
#include <stdlib.h>
#include <locale.h>

int main() {
  setlocale(LC_ALL,""); // inherit locale setting from environment
  int r;
  char wc_char[4] = {0,0,0,0};
  wchar_t myChar1 = L'?'; //greek 

  // should comment out either wprintf or printf, they don't run together
  r = wprintf(L"char is %lc (%x)\n", myChar1, myChar1);//On Linux, to UTF16

  r = wctomb(wc_char, myChar1); // On Linux, to UTF8
  r = printf("r:%d, %x, %x, %x, %x\n", r, …
Run Code Online (Sandbox Code Playgroud)

c linux console wchar-t wchar

1
推荐指数
1
解决办法
4966
查看次数

将指针(字符串)传递给C函数

请在阅读结束之前说:"哦不,这个问题又来了......"

我现在正坐在C课程中,课程书中提供了以下示例:

#include <stdio.h>
#include <stdint.h>

void Terminal_PrintData(uint16_t * const Data);

int main(void){
    uint16_t StringData[] = "MyData";
    Terminal_PrintData(StringData);
}

void Terminal_PrintData(uint16_t * const Data)
{
    printf("Value: %s", *Data);
}
Run Code Online (Sandbox Code Playgroud)

当我编译这个杰作时,这就是我得到的:

F:\AVR Microcontroller>gcc -o test test.c
test.c: In function 'main':
test.c:7:26: error: wide character array initialized from non-wide string
  uint16_t StringData[] = "MyData";
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 声明一个字符串是否正确uint16_t
  • 将字符串传递给函数的推荐方法是什么?

c

0
推荐指数
1
解决办法
1295
查看次数

标签 统计

c ×3

c++ ×1

console ×1

linux ×1

multibyte ×1

named-pipes ×1

pipe ×1

powershell ×1

printf ×1

unicode ×1

utf-8 ×1

wchar ×1

wchar-t ×1

winapi ×1