我对"umlauts“(字母,ü,.)有异议。以及C++中的in。
我使用curl下载html页面,并使用ifstream逐行读取下载的文件并解析其中的一些数据。这很好,直到我有了一条类似于下列之一的行:
te="Olimpija Laibach - Tromsö";
te="Burghausen - Münster";我的代码解析这些行并输出如下:
Olimpija Laibach vs. Troms?
Burghausen vs. M?nster像直接从代码工作输出umlauts这样的事情:
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>发布于 2012-07-23 08:42:24
嵌入在fin中的区域设置是什么?在您显示的代码中,它将是全局区域设置,如果您没有重置它,则是"C"。
如果你在盎格鲁-撒克逊世界之外的任何地方--你所显示的字符串表明你是--你在main做的第一件事应该是
std::locale::global( std::locale( "" ) );这将全局区域设置(因此是以后打开的任何流的默认区域设置)设置为在周围环境中使用的区域设置。(在形式上,对于定义的本机环境,但在实践中,无论用户使用什么,都是如此。)在"C"语言环境中,编码几乎总是ASCII;ASCII不识别Umlauts,根据标准,输入中的非法编码应该替换为实现定义字符(IIRC--自从我重新阅读本节以来已经有一段时间了)。当然,在输出中,您不应该有任何未知的字符,所以实现不会检查它们,也不会检查是否通过。
由于std::cin等是在您有机会设置全局区域之前打开的,所以您必须具体地向它们注入std::locale( "" )。
如果这不起作用,您可能需要找到一些特定的地区来使用。
https://stackoverflow.com/questions/11608790
复制相似问题