C ++ ifstream和“变形金刚”

时间:2012-07-23 08:21:24

标签: c++ ifstream

我遇到了“变音符号”(字母ä,ü,ö,...)和ifstream in C ++的问题。

我使用curl下载一个html页面和ifstream来逐行读取下载的文件并从中解析一些数据。这很顺利,直到我有一行如下所示:

te="Olimpija Laibach - Tromsö";
te="Burghausen - Münster";

我的代码解析这些行并将其输出如下:

Olimpija Laibach vs. Troms?
Burghausen vs. M?nster

直接从代码工作中输出变音符号的事情:

cout << "öäü" << endl; // This works fine

我的代码看起来有点像这样:

ifstream fin("file");

while(!(fin.eof())) {
    getline(fin, line, '\n');
    int pos = line.find("te=");
    if(pos >= 0) {
         pos = line.find(" - ");
         string team1 = line.substr(4,pos-4);
         string team2 = line.substr(pos+3, line.length()-pos-6);
         cout << team1 << " vs. " << team2 << endl;
   }
}

编辑:奇怪的是,相同的代码(唯一改变的东西是源和分隔符)适用于另一个文本输入文件(相同的过程:使用curl下载,使用ifstream读取) 。解析并输出如下所示的行是没有问题的:

<span id="...">Fernwärme Vienna</span>

1 个答案:

答案 0 :(得分:2)

fin中嵌入的语言环境是什么?在你展示的代码中,它会 是全局区域设置,如果您尚未重置,则为"C"

如果你在盎格鲁 - 撒克逊世界之外的任何地方 - 和弦乐 你表明你是 - 你做的第一件事之一 main应该是

std::locale::global( std::locale( "" ) );

这将设置全局区域设置(因此也是任何流的默认区域设置) 稍后打开)到周围环境中使用的语言环境。 (形式上,对于实现定义的本机环境,但在 练习,无论用户使用什么。)在"C"语言环境中,编码 几乎总是ASCII; ASCII不识别变音符号,并且根据 对于标准,输入中的非法编码应替换为 实施定义的特征(IIRC-已经有一段时间了 我实际上重读了这一节)。当然,在输出中,你不是 应该有任何未知的字符,所以实现没有 检查他们,并通过。

由于在您有机会设置之前打开了std::cin等 全局区域设置,您必须专门为它们注入std::locale( "" )

如果这不起作用,您可能必须找到一些特定的区域设置 使用