我正在从文件(UTF-8编码)中读取一些文本并将其存储在地图中,以评估文件中每个单词的包含次数:
map<string, int> my_map;
ifstream f("file.txt");
string s;
while (f >> s)
{
my_map[s]++;
}
然后我想用cout输出结果:
for (map<string,int>::const_iterator i = my_map.begin(); i != my_map.end(); i++)
{
cout << i->first << ": " << i->second << "\n";
}
问题是,因为我的文件中包含一些字符,如ä和ö(用瑞典语编写),当我打印出来的时候,大部分文字显示不正确。我该如何解决这个问题?
答案 0 :(得分:0)
UTF-8编码与任何文本编码一样,是一种将字符表示为字节流的方法。您的程序正在读取该字节流并简单地将其回显,因此显示不正确的问题是由于您的终端未设置为正确的编码:我在终端上尝试了您的程序,它产生了预期的输出。
但是,如果您想使用将作为Unicode字符串读取的字符串,那么string
将是不够的,因为它只是char
的字符串,每个包含一个字节。您应该使用wstring
,它是wchar
的字符串,每个字符串都足以存储您的Unicode字符。 (这也意味着必须使用wcin
,wcout
和wifstream
。)
但这仍然不够:您需要为流指定 locale ,以使它们将UTF-8字节流解码为字符(并从字符转换为UTF) -8再次)。相关的行将如下所示。因为您正在阅读瑞典语,所以我将语言环境设置为sv_SE.UTF-8
,但其他UTF-8语言环境可能足以满足您的需要:
#include <locale>
// ...
locale utf_8("sv_SE.UTF-8");
wcout.imbue(utf_8);
wifstream f("file.txt");
f.imbue(utf_8);