如何正确显示从文件中读取的外来字符?

时间:2015-07-04 17:57:05

标签: c++ cout

我正在从文件(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";
}

问题是,因为我的文件中包含一些字符,如ä和ö(用瑞典语编写),当我打印出来的时候,大部分文字显示不正确。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

UTF-8编码与任何文本编码一样,是一种将字符表示为字节流的方法。您的程序正在读取该字节流并简单地将其回显,因此显示不正确的问题是由于您的终端未设置为正确的编码:我在终端上尝试了您的程序,它产生了预期的输出。

但是,如果您想使用将作为Unicode字符串读取的字符串,那么string将是不够的,因为它只是char的字符串,每个包含一个字节。您应该使用wstring,它是wchar的字符串,每个字符串都足以存储您的Unicode字符。 (这也意味着必须使用wcinwcoutwifstream。)

但这仍然不够:您需要为流指定 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);