制作宽字符文件

#ifndef UNICODE #define UNICODE #endif #include <stdio.h> int main() { FILE* oFile; oFile = _wfopen(L"foo.txt",L"w"); //* fwprintf(oFile,L"%s", L"ęłó☺☻♥♦•ń"); fclose(oFile); return 0; } 

为什么这个程序创build一个ASCII文件而不是UTF-16,虽然所有的function都很宽?

foo.txt内容:

za [问号]ó[两个问号…] g […四个] ja [另外两个…] [五个*?] [和最后一个]

这是不可兑现的。

 fwprintf(oFile,L"%c%c%s",0xFE,0xFF,L"zażółć gęśłą jaźń ☺☻♥♦• ć"); 

现在,它显示中国的标志,无论小或大端字节顺序标记设置。

Solutions Collecting From Web of "制作宽字符文件"

假设您正在使用MSVC,请引用_wfopen (粗体矿井)的文档:

fopen函数打开文件名指定的文件。 _wfopen是fopen的一个宽字符版本; _wfopen的参数是宽字符字符串。 否则,_wfopen和fopen的行为是一致的。 只使用_wfopen对文件流中使用的编码字符集没有影响。

在文档中进一步阅读:

fopen支持Unicode文件流。 要打开一个Unicode文件,请将指定所需编码的ccs标志传递给fopen,如下所示。

fopen(&fp,“newfile.txt”,“rw,ccs = encoding”);

允许的编码值是UNICODE,UTF-8和UTF-16LE。

以下代码将编写一个UTF-8编码的文件。 我用UTF-16BE,UTF-16LE和UTF-8保存了这个源文件,MSVC能够正确编译和运行。

 #include <stdio.h> int main() { FILE* oFile; oFile = fopen("foo.txt","w, ccs=UTF-8"); fwprintf(oFile,L"%s", L"ęłó☺☻♥♦•ń"); fclose(oFile); return 0; } 

请注意,在Windows命令行上显示此输出需要切换到UTF-8代码页:

 C:\x>chcp Active code page: 1252 C:\x>x C:\x>type foo.txt ęłó☺☻♥♦•ń C:\Users\metolone\Desktop\x>chcp 65001 Active code page: 65001 C:\x>type foo.txt ęłó☺☻♥♦•ń 

在C或C ++程序中选择字符宽度(char或wchar_t)与文件编码完全无关。

如果您需要使用UTF16LE编码的文件,则需要使用指定UTF16LE的语言环境,可以将其作为全局语言环境,也可以将其嵌入到C ++流中。 或者,您可以自己将字符转换为UTF16LE编码的字节序列(使用iconv或Windows上的任何模拟字符),并使用面向字节的输出将其发送到文件。

NB1:宽字符字符串需要"%ls"格式。

NB2:字符串文字中的非ASCII字符是不可移植的。

NB3:你的标签是“c”, <cstdio>是C ++,但是这个程序不是一个有效的C ++程序。 你使用哪种语言? 下定决心;)