考虑下面的程序:FWRITE非ASCII字符
#include <stdio.h>
#include <string.h>
int main() {
char* alpha = "Ω";
fwrite(alpha, 1, strlen(alpha), stdout);
return 0;
}
在Windows上,我得到以下的输出:
��
我试图改变行这样:
char* alpha = "zΩ";
并正确打印。输出正确编码,就无法正确打印 :
$ bad | od -tx1c 0000000 ce a9 316 251 $ good | od -tx1c 0000000 7a ce a9 z 316 251
我如何FWRITE用非ASCII作为第一个字符?
为了回应一些评论:源文件被正确格式化为UTF-8,和我的代码页也被正确设置为UTF-8:
$ chcp.com Active code page: 65001
呼叫'_setmode(_fileno(标准输出),_O_U16TEXT)'然后写一个'wchar_t的*'广字符串使用'fwrite'。由于底层CRT文件是UTF-16模式并且是控制台,因此通过调用Unicode API'WriteConsoleW'实现写入。 – eryksun
这适用于我:'wchar_t * alpha = L“Ω”;''_setmode(_fileno(stdout),_O_U16TEXT);''fwrite(alpha,2,wcslen(alpha),stdout);' – eryksun
{0xa9,0x03 }是“Ω”的小端UTF-16,即U + 03A9。你是否使用普通的Windows控制台来运行这个控制台,或者在一个POSIX shell中运行,并将其导入到某种pty实现中?检查'GetFileType(GetStdHandle(STD_OUTPUT_HANDLE))'。它是'FILE_TYPE_CHAR'(2,一个控制台缓冲区句柄)还是'FILE_TYPE_PIPE'(3)? – eryksun