我有一个包含一些字符的文本文件,包括一些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按需运行?我更喜欢一种适用于所有平台的格式,但在这个阶段我会采取任何措施。
感谢。
答案 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")
也可以。