【发布时间】:2021-08-05 16:27:48
【问题描述】:
在Linux环境下,我有一段读取unicode文件的代码,类似如下图。
但是,无法正确处理特殊字符(如丹麦字母 æ、ø 和 å)。对于“abcæøåabc”行,输出只是“abc”。使用调试器我可以看到wline 的内容也只有a\000b\000c\000。
#include <fstream>
#include <string>
std::wifstream wif("myfile.txt");
if (wif.is_open())
{
//set proper position compared to byteorder
wif.seekg(2, std::ios::beg);
std::wstring wline;
while (wif.good())
{
std::getline(wif, wline);
if (!wif.eof())
{
std::wstring convert;
for (auto c : wline)
{
if (c != '\0')
convert += c;
}
}
}
}
wif.close();
谁能告诉我如何让它阅读整行?
感谢和问候
【问题讨论】:
-
对文件进行十六进制转储,它包含什么?
-
我得到了以下十六进制转储
0000000: fffe 6100 6200 6300 e600 f800 e500 6100 ..a.b.c.......a. 0000010: 6200 6300 0d00 0a00 b.c.....即使字符本身没有显示在上面的输出中,至少十六进制值似乎是正确的 -fffe用于 utf-16-le 编码,@987654327 @ 代表 æ,f800代表 ø,e500代表 æ。 -
您需要使用带有 UTF-16LE 语言环境的
imbue来指示文件的格式。我试图为您找到相关指南,但找不到。 -
@MarkRansom: en.cppreference.com/w/cpp/locale/codecvt_utf16 显示了一个示例。