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

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

4

2 回答 2

5

假设您使用的是 MSVC,请引用_wfopen的文档(我的粗体):

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

进一步阅读文档:

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

fopen(&fp, "newfile.txt", "rw, ccs= 编码");

允许的编码值为 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
ęłó☺☻♥♦•ń
于 2012-05-27T06:34:43.410 回答
2

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

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

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

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

NB3:您的标签上写着“c”,<cstdio>是 C++,但该程序不是有效的 C++ 程序。您使用哪种语言?下定决心;)

于 2012-05-26T21:22:24.147 回答