char vs wchar_t

Alc*_*ott 7 c encoding wchar-t

我正在尝试打印出一个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_: ????
Run Code Online (Sandbox Code Playgroud)

题:

  1. 显然我不应该将CJK字符分配给第1行中的char*指针,但我只是这样做了,第3行的输出是正确的,为什么呢?第3行中的printf()怎么能给我非ascii字符?它以某种方式知道编码吗?

  2. 我假设第2行和第4行的代码是正确的,但为什么我没有获得第4行的任何输出?

Mys*_*ial 8

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

现在,至于为什么wprintf()不工作.这与流方向有关.每个流只能设置为普通或宽.设置后,无法更改.它是在第一次使用时设置的.(由于ascii printf).之后,wprintf由于方向不正确,将无法正常工作.

换句话说,一旦你使用,printf()你需要继续使用printf().同样,如果你开始wprintf(),你需要继续使用wprintf().

你不能混合printf()wprintf().(在Windows上除外)

编辑:

回答关于为什么这wprintf条线甚至不能自己工作的问题.这可能是因为正在编译代码以便????存储UTF-8格式wchar_.但是,wchar_t需要4字节的unicode编码.(Windows中的2个字节)

所以我可以想到两个选项:

  1. 不要打扰wchar_t,只需坚持使用多字节chars.这是一种简单的方法,但如果用户的系统未设置为中文语言环境,则可能会中断.
  2. 使用wchar_t,但您需要使用unicode转义序列对中文字符进行编码.这显然会使它在源代码中无法读取,但它可以在任何可以打印中文字符字体而不管语言环境的机器上工作.


R..*_*R.. 6

第1行不是ascii,它是编译器在编译时使用的任何多字节编码.在现代系统上,可能是UTF-8.printf不知道编码.它只是向stdout发送字节,只要编码匹配,一切都很好.

您应该注意的一个问题是第3行和第4行一起调用未定义的行为.你不能在同一个FILE(stdout)上混合基于字符和宽字符的io .在第一次操作之后,它FILE具有"方向"(字节或宽),之后,任何执行相反方向操作的尝试都会产生UB.