我正在尝试打印出 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 字符通常不是一个好主意。可能发生的情况是中文字符被编码为与 ascii 一起使用的 UTF-8。
现在,至于为什么wprintf()
不工作。这与流方向有关。每个流只能设置为正常或宽。一旦设定,就无法更改。第一次使用时已设置。 (这是ascii,因为printf
)。之后wprintf
由于方向不正确而无法工作。
换句话说,一旦你使用printf()
你需要继续使用printf()
。同样,如果你从wprintf()
,你需要继续使用wprintf()
.
你不能混合printf()
and wprintf()
。 (Windows 上除外)
EDIT:
回答关于为什么的问题wprintf
线路本身也无法工作。可能是因为代码正在编译,所以UTF-8格式中日友好
被存储到wchar_
。然而,wchar_t
需要 4 字节 unicode 编码。 (Windows 中为 2 字节)
所以我可以想到两个选择:
- 别打扰
wchar_t
,并坚持使用多字节char
s。这是最简单的方法,但如果用户的系统未设置为中文语言环境,则可能会失败。
- Use
wchar_t
,但是您需要使用 unicode 转义序列对中文字符进行编码。这显然会使其在源代码中不可读,但它可以在任何可以打印汉字字体的机器上运行,无论语言环境如何。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)