#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;
}
为什么这个程序创建一个ASCII文件而不是UTF-16,尽管所有函数都很宽?!
foo.txt内容:
za [问号]ó[两个问号...] g [...四...] ja [另外两个......] [五个*?] [和最后一个]
这是不可能的。
fwprintf(oFile,L"%c%c%s",0xFE,0xFF,L"zażółć gęśłą jaźń ☺☻♥♦• ć");
现在,它显示中文符号,无论是否设置了小端或大端字节顺序标记。
答案 0 :(得分:5)
假设您使用的是MSVC,请引用_wfopen(大胆的我的)文档:
fopen函数打开filename指定的文件。 _wfopen是fopen的宽字符版本; _wfopen的参数是宽字符串。否则,_wfopen和fopen表现得很好 相同。 仅使用_wfopen对编码字符没有影响 设置在文件流中使用。
在文档中进一步阅读:
fopen支持Unicode文件流。要打开Unicode文件,请传递一个 ccs标志,指定fopen所需的编码,如下所示。
fopen(&amp; 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
ęłó☺☻♥♦•ń
答案 1 :(得分:2)
在C或C ++程序中选择字符宽度(char或wchar_t)与文件编码完全无关。
如果您需要一个UTF16LE编码的文件,则需要使用指定UTF16LE的语言环境,作为全局语言环境,或者在C ++流中嵌入。或者,您可以自己将字符转换为UTF16LE编码的字节序列(使用iconv
或Windows上的任何类似字符),并使用面向字节的输出将其发送到文件。
NB1:宽字符字符串需要"%ls"
格式。
NB2:字符串文字中的非ASCII字符是不可移植的。
NB3:你的标签上写着“c”,<cstdio>
是C ++,但程序不是有效的C ++程序。你使用哪种语言?下定决心;)