我正在尝试打印出 wchar_t* 字符串。
代码如下:

#include <stdio.h>
#include <string.h>
#include <wchar.h>

char *ascii_ = "中日友好";  //line-1
wchar_t *wchar_ = L"中日友好";  //line-2

int main()
{
    printf("ascii_: %s\n", ascii_);  //line-3
    wprintf(L"wchar_: %s\n", wchar_);  //line-4
    return 0;
}

//Output
ascii_: 中日友好

问题:
  • 显然我不应该将 CJK 字符分配给第 1 行中的 char* 指针,但我只是这样做了,并且第 3 行的输出是正确的,那为什么?第 3 行中的 printf() 如何给我非 ascii 字符?它以某种方式知道编码吗?
  • 我假设第 2 行和第 4 行中的代码是正确的,但是为什么我没有得到第 4 行的任何输出?
  • 最佳答案

    首先,在源代码中使用非 ASCII 字符通常不是一个好主意。可能发生的情况是中文字符被编码为 UTF-8,可与 ascii 一起使用。

    现在,至于为什么 wprintf() 不起作用。这与流方向有关。每个流只能设置为正常或宽。一旦设置,就无法更改。首次使用时设置。 (由于 printf 是 ascii )。之后 wprintf 由于方向不正确而无法工作。

    换句话说,一旦您使用printf(),就需要继续使用printf()。同样,如果您从 wprintf() 开始,则需要继续使用 wprintf()

    您不能混合使用 printf()wprintf() 。 (Windows 除外)

    编辑:

    回答关于为什么 wprintf 行本身不起作用的问题。可能是因为正在编译代码,所以将 中日友好 的 UTF-8 格式存储到 wchar_ 中。但是,wchar_t 需要 4 字节的 unicode 编码。 (在 Windows 中为 2 字节)

    所以我能想到的有两种选择:

  • 不要理会 wchar_t ,只要坚持使用多字节 char 即可。这是一种简单的方法,但如果用户的系统未设置为中文语言环境,则可能会中断。
  • 使用 wchar_t ,但您需要使用 unicode 转义序列对中文字符进行编码。这显然会使它在源代码中不可读,但它可以在任何可以打印汉字字体的机器上工作,而不管语言环境如何。
  • 关于char vs wchar_t,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7496203/

    10-11 15:13