制作宽字符文件

时间:2012-05-26 19:09:43

标签: c windows unicode

#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źń ☺☻♥♦• ć");

现在,它显示中文符号,无论是否设置了小端或大端字节顺序标记。

2 个答案:

答案 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 ++程序。你使用哪种语言?下定决心;)