【发布时间】:2016-06-26 00:38:27
【问题描述】:
我正在尝试在 Windows 上使用 MinGW C 创建宽字符文件,但是宽字符似乎被省略了。我的代码:
const wchar_t* str = L"příšerně žluťoučký kůň úpěl ďábelské ódy";
FILE* fd = fopen("file.txt","w");
// FILE* fd = _wfopen(L"demo.txgs",L"w"); // attempt to open wide file doesn't help
fwide(fd,1); // attempt to force wide mode, doesn't help
fwprintf(fd,L"%ls",str);
// fputws(p,fd); // stops output after writing "p" (1B file size)
fclose(fd);
文件内容
píern luouký k úpl ábelské ódy
文件大小为 30B,因此确实缺少宽字符。如何说服编译器编写它们?
正如@chqrlie 在 cmets 中建议的那样:
fwrite(str, 1, sizeof(L"příšerně žluťoučký kůň úpěl ďábelské ódy"), fd);
是 82(我猜是 2*30 + 2*10(省略的字符)+ 2(宽尾随零))。
引用from here也可能有用
文件中宽字符的外部表示是多字节的 字符:这些是像调用 wcrtomb 进行转换一样获得的 每个宽字符(使用流的内部 mbstate_t 对象)。
这解释了为什么 ISO-8859-1 字符在文件中是单字节的,但我不知道如何使用这些信息来解决我的问题。做相反的任务(将多字节 UTF-8 读入宽字符)我没有使用 mbtowc 并最终使用了 winAPI 的 MultiByteToWideChar。
【问题讨论】:
-
您可能需要使用
_wfopen -
另外,在源代码中嵌入 unicode 可能不起作用(我安装的 mingw-w64 在编译时拒绝您的字符串文字)
-
我刚刚用了
_wfopen,输出是一样的。编译时错误很有趣。 -
您能否验证
WCHAR扩展为wchar_t,或者将str的定义更改为const wchar_t *s = ...。 -
看起来是编码问题,没有一个非 ISO-8859-1 字符出来。你的源文件是用 utf-8 编码的吗?编译器是否默认识别这种编码?需要BOM吗?你能打印
fwide(fp, 1);的返回值吗?你可以试试fwrite(str, 1, sizeof(L"příšerně žluťoučký kůň úpěl ďábelské ódy"), fp);吗?