【问题标题】:fwprintf omits wide charsfwprintf 省略宽字符
【发布时间】: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);吗?

标签: c file mingw widechar


【解决方案1】:

我想通了。 wcrtomb 的内部使用(在我的问题的细节中提到)需要 setlocale 调用,但该调用在 Windows 上使用 UTF-8 失败。所以我在这里使用了winAPI:

char output[100]; // not wchar_t, write byte-by-byte
int len = WideCharToMultiByte(CP_UTF8,0,str,-1,NULL,0,NULL,NULL);
if(len>100) len = 100;
WideCharToMultiByte(CP_UTF8,0,str,-1,output,len,NULL,NULL);
fputs(output,fd);

瞧!该文件长 56B,包含预期的 UTF-8 内容:

příšerně žluťoučký kůň úpěl ďábelské ódy

我希望这可以为 Windows 编码人员节省一些神经。

【讨论】:

  • 由于setlocale() 缺少标准参数,宽字符支持似乎被彻底破坏了。太糟糕了,它是 Windows 中的默认设置。查看这个问题的答案以获得提示:stackoverflow.com/questions/3973582/…
【解决方案2】:

我不是 Windows 用户,但你可以试试这个:

const wchar_t *str = L"příšerně žluťoučký kůň úpěl ďábelské ódy";
FILE *fd = fopen("file.txt", "w,ccs=UTF-8");
fwprintf(fd, L"%ls", str);
fclose(fd);

我从这个问题中得到了这个想法:How do I write a UTF-8 encoded string to a file in windows, in C++

【讨论】:

    猜你喜欢
    • 2012-10-05
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 2018-03-06
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多