Извлечь правильный текст из wifstream независимо от кодировки - PullRequest
3 голосов
/ 14 февраля 2010

Вот программа: http://codepad.org/eyxunHot
The кодировка файла UTF-8.

У меня есть текстовый файл с именем "config.ini" со следующим словом: ➑ball

Если я использую блокнот для сохранения файла с кодировкой «UTF-8», то запускаю программу, в соответствии с отладчиком, значение eight_ball равно: ï »¿âball

Если я использую блокнот для сохранения файла с кодировкой «Юникод», то запускаю программу, в соответствии с отладчиком, значение eight_ball равно: ÿþ'b

Если я использую блокнот для сохранения файла с кодировкой Unicode big endian, затем запустите программу, в соответствии с отладчиком, значение eight_ball равно: Thy '

Во всех этих случаях результат неверен. Также кодировка ANSI не поддерживает символ ➑. Как мне убедиться, что слово ➑ball будет извлечено из файла, когда я перейду config_file >> eight_ball, независимо от кодировки? Я хочу, чтобы вывод этой программы был "Программа верна" независимо от кодировки config.ini.

Ответы [ 3 ]

1 голос
/ 14 февраля 2010

Если вы работаете в Windows и хотите использовать файлы INI, имейте в виду, что API-интерфейсы INI без проблем поддерживают файлы INI Unicode (UTF-16 с прямым порядком байтов), вам просто нужно предоставить пустой файл вместе со спецификациейначало.

Кстати, если вы хотите работать с потоками C ++ и Unicode, вы можете посмотреть эту статью .Помимо UTF8, вы также узнаете, как работает преобразование символов в потоке C ++.

1 голос
/ 14 февраля 2010

Может быть, вы можете использовать библиотеку ICU.

В Windows много проблем с поддержкой UTF. Моя Ubuntu использует кодировки UTF-8 по умолчанию, и эта проблема решена, но Unix-подобная ОС имеет странную реализацию стандартной библиотеки C ++. Я имею в виду использование char * для хранения текста UTF-8 (в нем используются 2 ячейки массива на букву). Но с классом строки это очищает.

0 голосов
/ 14 февраля 2010

Вам нужно установить локаль, прежде чем wstreams будет работать правильно. Вместо этого я бы предложил использовать обычные потоки и некоторую библиотеку для преобразования символов, так как ваша входная кодировка обычно будет отличаться в любом случае. Лучший алгоритм в наши дни - сначала попытаться прочитать как UTF-8, а в случае неудачи - как CP1252 или как-то другой, настраиваемый пользователем, старый набор символов.

...