C++ ifstream 和 "umlauts"

标签 c++ ifstream

我在 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>

最佳答案

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

如果您身处盎格鲁-撒克逊世界之外的任何地方——以及弦乐 你的表现表明你是——你做的第一件事之一 main 应该是

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

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

由于 std::cin 等在您有机会设置 全局语言环境,您必须专门为它们注入(inject) std::locale( "")

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

关于C++ ifstream 和 "umlauts",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11608790/

相关文章:

C++如何检查 vector 的内容是否存在于另一个 vector 中?

c++ - 数组初始化和查找字母频率

c++ - 使用 ifstream 在 while 循环中将数据传递给 vector

c++ - 如何交替从文件中获取一行数据和一个整数?

C++ 17 为什么不删除二合字母和三合字母?

c++ - BCryptGenRandom STATUS_INVALID_HANDLE

C++ 调用堆栈不符合标准?

c++ - vector 中这种删除方法有什么问题?

c++ - 当文件有足够的数据c++时无法从文件中读取足够的数据

c++ - 读取 Matrix txt 文件并存储为数组