在C++中读取包含特殊字符(如é)的ISO-8859类型文件

3
我正在尝试读取一个使用ISO-8859(ANSI)编码的文件,其中包含一些西欧字符,例如“ é”。 当我尝试读取该文件并输出结果时,所有特殊字符都显示为“ �”,而正常字母则正确显示。
如果我将文件转换为utf-8格式,然后再执行同样的操作,一切都能完美地工作。
有人有解决这个问题的想法吗?我尝试使用wifstreamwstring而不是 ifstream string ,但效果不太好。
这是我的示例代码:
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    ifstream myFS;
    myFS.open("test.txt", ios::in);
    string myString; 
    if(myFS.is_open()){
        while(myFS >> myString)
            cout << myString << endl;
    }
    myFS.close();
    return 0;
}

test.txt(ISO-8859-15格式)包含:

abcd éfg

结果:

abcd 
�fg

任何建议都将不胜感激。 提前致谢!


+)
忘了提到我的系统环境。
我正在使用带有g ++ ver 4.4.5的ubuntu 10.10(Maverick)控制台。
谢谢!


2
可能是控制台输出的问题,请告诉我们您的环境细节。 - CharlesB
刚刚添加了我的系统环境。它是Ubuntu 10.10,带有g++ 4.4.5。 - devEvan
1个回答

7
你的控制台设置为使用UTF-8编码,因此当您仅使用cout将ISO-8859-15编码的文件转储到控制台时,它会显示错误的字符。 ASCII代码<128的字符在两种编码中是相同的,这意味着屏幕上所有这些字符都将正确显示。
程序的输出实际上是正确的,只是你的控制台没有正确设置输出。
我还建议对不全是ASCII的文件使用ios::binary,否则您可能会在其他平台上遇到问题。

1
+1:正确。实际上,程序甚至没有编码的概念...它只是在传输字节。 - Lightness Races in Orbit
我将结果输出到文件中,而不是打印到控制台屏幕上,结果发现文件包含了正确的字符,就像你说的一样。谢谢! - devEvan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接