3

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

我使用 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>
4

1 回答 1

2

嵌入的语言环境是fin什么?在您显示的代码中,它将是全局语言环境,如果您没有重置它,它就是"C".

如果你在盎格鲁-撒克逊世界之外的任何地方——你所展示的字符串表明你是——你首先要做的事情之一 main应该是

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

这会将全局区域设置(以及随后打开的任何流的默认区域设置)设置为在周围环境中使用的区域设置。(形式上,对于实现定义的本地环境,但在实践中,对于用户正在使用的任何东西。)在"C"语言环境中,编码几乎总是 ASCII;ASCII 不识别元音变音符号,根据标准,输入中的非法编码应替换为实现定义的字符(IIRC——我已经有一段时间没有真正重读本节了)。当然,在输出中,您不应该有任何未知字符,因此实现不会检查它们,然后通过。

由于std::cin等在您有机会设置全局语言环境之前已打开,因此您必须专门为它们灌输std::locale( "" )

如果这不起作用,您可能必须找到一些特定的语言环境来使用。

于 2012-07-23T08:42:24.773 回答