2010-02-14 1 views
3

вот программа: http://codepad.org/eyxunHot
Кодировка файла - UTF-8.Извлечь текст из wifstream независимо от его кодировки

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

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

Если я использую блокнот, чтобы сохранить файл с кодировкой„Unicode“, а затем запустить программу, в соответствии с отладчиком значение eight_ball является: Yth» b

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

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

+1

Обратите внимание, что ваша проблема принципиально неразрешима. Если я сохраню файл Latin-1 с содержимым «ï» ¿âball »(8 действительных символов), нет способа отличить его от файла UTF-8, содержащего ➑ball (5 действительных символов). Они равны 8 байтам. – MSalters

ответ

0

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

+0

Не могли бы вы быть более конкретными? Что это за «некоторая библиотека для преобразования символов», которую я должен использовать? Как бы я прочитал из файла, если бы знал, что он закодирован в UTF-8? – scwizard

+1

Вы можете попробовать библиотеку iconv. –

1

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

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

1

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

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