2012-07-23 240 views
3

我遇到了“变音符号”(字母ä,ü,ö,...)和ifstream在C++中的问题。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> 
+3

看起来像一个编码问题 – SingerOfTheFall 2012-07-23 08:23:33

+0

一旦你知道输入的编码是什么,一些cppreference的例子可能会有帮助, [here](http://en.cppreference.com/w/cpp/locale/codecvt#Example) – jogojapan 2012-07-23 08:25:04

+0

[do(w)ifstream支持不同的编码](http:// stackoverflow。com/questions/1274910/do-wifstream-support-different-encodings) – jogojapan 2012-07-23 08:26:37

回答

2

什么是语言环境嵌入fin?在你显示的代码中, 是全球语言环境,如果你还没有重置它,则是"C"

如果你在任何地方盎格鲁 - 撒克逊世界—外 告诉你的琴弦认为你是你 做的第一件事情—一个main应该

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

这台全球语言环境(以及稍后打开的任何流 的默认语言环境)转换为周围环境中使用的语言环境。 (形式上,为一个实现定义的本地环境,但在 练习中,无论用户在使用什么)。在"C"区域设置中,编码 几乎总是ASCII; ASCII不承认变音,并根据 的标准,在输入非法编码应与 实现定义的字符替代(IIRC —它已经有一段时间,因为 我实际上重读本节)。在输出中,当然,你不是 应该有任何未知的字符,所以执行不 检查他们,并通过。

由于std::cin等在您有机会设置 全球语言环境之前打开,因此您必须具体使用std::locale("")来补充它们。

如果这不起作用,您可能需要找到一些特定区域设置为 的用法。

+1

描绘HTML的编码是不平凡的。 (在最好的情况下,找到一行像'')使用用户的区域设置只是一个稍微好一点的猜测。 – MSalters 2012-07-23 08:51:19

+0

不幸的是,这并没有帮助。包括'std :: locale :: global(std :: locale(“de_DE.UTF-8”));'作为'main'中的第一行,但输出保持不变。值得一提的是,我在美国使用Amazon EC2实例来编译和运行代码。 – mike 2012-07-23 08:56:16

+0

@mike:“UTF-8”实际上是输入编码吗? (它可能是ISO-8859-1或ISO-8859-15,或者完全不同的东西。)您正在使用的系统上是否实际支持'de_DE.UTF-8'? – DevSolar 2012-07-23 09:09:58