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

dev*_*van 2 c++ ansi utf-8 special-characters ifstream


我正在尝试读取一个用ISO-8859(ansi)编码的文件,它包含一些西欧字符,如"é".
当我尝试读取文件并输出结果时,所有特殊字符显示为 ,而正常字母显示正确.

如果我将文件转换为utf-8格式然后执行相同的工作,一切都很完美.
有没有人有任何想法来解决这个问题?我尝试使用wifstreamwstring而不是ifstreamstring,但没有多大帮助.

这是我的示例代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

abcd éfg
Run Code Online (Sandbox Code Playgroud)

结果:

abcd 
?fg
Run Code Online (Sandbox Code Playgroud)

任何建议将被认真考虑.先感谢您!


+)
忘了提及我的系统环境.
我正在使用ubuntu 10.10(Maverick)控制台与g ++ ver 4.4.5
谢谢!

Joa*_*son 7

您的控制台设置为使用UTF-8,因此当您使用cout将ISO-8859-15中的文件转储到控制台时,它会显示错误的字母.ascii代码<128的字母在两种编码中都是相同的,这意味着所有这些字符都将在屏幕上正确显示.

程序的输出实际上是正确的,它只是你的控制台没有设置为正确显示输出.

我还建议使用ios::binary不是ascii的文件,否则以后可能会在其他平台上遇到问题.