fwprintf省略了广泛的字符

时间:2016-03-10 22:43:20

标签: c file mingw widechar

我正在尝试在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在评论中建议的那样:

的结果
fwrite(str, 1, sizeof(L"příšerně žluťoučký kůň úpěl ďábelské ódy"), fd);

是82(我猜2 * 30 + 2 * 10(ommited chars)+ 2(宽尾零))。

引用from here

也可能有用
  

文件中宽字符的外部表示是多字节的   字符:获取这些字符就像调用wcrtomb进行转换一样   每个宽字符(使用流的内部mbstate_t对象)。

这解释了为什么ISO-8859-1字符在文件中是单字节的,但我不知道如何使用这些信息来解决我的问题。执行相反的任务(将多字节UTF-8读入宽字符)我未能使用mbtowc并最终使用winAPI的MultiByteToWideChar

2 个答案:

答案 0 :(得分:1)

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

9

瞧!该文件长度为56B,具有预期的UTF-8内容:

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);

我希望这会为Windows程序员节省一些神经。

答案 1 :(得分:1)

我不是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++