Чтение файла типа ISO-8859, содержащего специальные символы, такие как é в C++


Я пытаюсь прочитать файл, закодированный в ISO-8859 (ansi), и он содержит некоторые западноевропейские символы, такие как "é".
Когда я пытаюсь прочитать файл и вывести В результате все специальные символы отображаются как �, тогда как обычные алфавиты отображаются правильно.

Если я конвертирую файл в формат utf-8, а затем выполняю ту же работу, все работает отлично.
Действительно ли у кого-нибудь есть идея решить эту проблему? Я пытался использовать wifstream и wstring вместо 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

Любые советы будут оценены. Заранее спасибо!


+)
забыл упомянуть мою системную среду.
Я использую консоль Ubuntu 10.10 (Maverick) с g++ версии 4.4.5
Спасибо!


person devEvan    schedule 29.01.2012    source источник
comment
Это может быть проблема с выводом на консоль. пожалуйста, расскажите подробности о вашей среде   -  person CharlesB    schedule 29.01.2012
comment
только что добавил свою системную среду. это Ubuntu 10.10 с g++ 4.4.5   -  person devEvan    schedule 29.01.2012


Ответы (1)


Ваша консоль настроена на использование UTF-8, поэтому, когда вы просто выгружаете файл в формате ISO-8859-15 на консоль с помощью cout, он показывает неправильные буквы. Буквы с кодом ascii ‹128 одинаковы в обеих кодировках, что означает, что все эти символы будут правильно отображаться на вашем экране.

Вывод программы на самом деле правильный, просто ваша консоль не настроена на правильное отображение вывода.

Я бы также рекомендовал использовать ios::binary для файлов, которые не все являются ascii, иначе позже у вас могут возникнуть проблемы на других платформах.

person Joachim Isaksson    schedule 29.01.2012
comment
+1: правильно. На самом деле программа даже не имеет понятия о кодировании... это просто перенаправление байтов. - person Lightness Races in Orbit; 29.01.2012
comment
Я вывел результат в файл вместо того, чтобы распечатать на экране консоли, и оказалось, что файл содержит правильные символы, как вы сказали. Спасибо! - person devEvan; 29.01.2012