Unicode字符无法从文件中正确加载

时间:2013-11-02 01:12:33

标签: c++ c unicode

我有一个包含一些字符的文本文件,包括一些unicode字符。我尝试使用以下编码保存此文件而不解决问题:UTF8,没有BOM的UTF8,UCS2 BE和UCS2 LE。这是尝试逐行读取文件的代码。

    std::wifstream infile("my_file.txt");
    wchar_t line[1024];
    while (infile.getline(line, sizeof(line))) { ... }

“line”具有代替unicode的垃圾值和具有ASCII字符的普通值。它的值看起来像:L“正常文本在这里”而不是L“€正常文本在这里”

我尝试过其他变体,例如:

    std::wifstream infile("my_file.txt");
    std::wstring line;
    while (std::getline(infile, line)){ ... }

我也尝试过设置语言环境。我在Windows电脑上。如何让unicode按需运行?我更喜欢一种适用于所有平台的格式,但在这个阶段我会采取任何措施。

感谢。

2 个答案:

答案 0 :(得分:2)

您似乎需要使用区域设置 imbue 输入流:请参阅https://stackoverflow.com/a/1275260/1967396

typedef wchar_t ucs4_t;

std::locale old_locale;
std::locale utf8_locale(old_locale,new utf8_codecvt_facet<ucs4_t>);

...

std::wifstream input_file("data.utf8");
input_file.imbue(utf8_locale);
ucs4_t item = 0;
while (ifs >> item) { ... }

答案 1 :(得分:1)

示例数据包含预期的Unicode字符

提供的样本数据“正常文本在这里”是3字节的字节顺序标记(BOM),表明这和以下是UTF-8编码的文本“这里的正常文本”。所以打开文件的各种方法都不会得到“€Normal text here”。

OP需要创建包含所需“€Normal text here”的文件。

Windows为fopen()中的模式提供了非标准选项,例如fopen("file.txt", "rccs=UNICODE")

请参阅http://msdn.microsoft.com/en-us/library/yeby3zcb(v=vs.90).aspx

一旦文件确实具有“€”,即使fopen("file.txt", "r")也可以。