Неприятный юникод и C ++: простой способ чтения текстового файла ASCII / UTF-8 / UTF-16 BE / LE - PullRequest
2 голосов
/ 18 января 2010

извините, если вопрос глупый и задавался тысячи раз, но я потратил несколько часов на поиски в Google и не смог найти ответ.

Я хочу прочитать в текстовом файле, который может быть любым из следующих: ASCII / UTF-8 / UTF-16 BE / LE Я предполагаю, что если файл в кодировке Unicode, то всегда присутствует спецификация.

Существует ли какой-либо автоматический способ (STL, Boost или что-то еще) использовать файловый поток или что-либо для чтения в файле построчно, не проверяя спецификации и всегда получая UTF8 для помещения в std :: string?

В этом проекте я использую только Windows. Было бы также полезно узнать, как решить эту проблему для других платформ.

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 19 января 2010

Спецификации часто отсутствуют в файлах UTF-8. Как следствие, вы не можете знать, является ли файл ASCII или UTF-8, пока вы не прочитаете данные и не найдете байт, который не является ASCII.

Кроме того, поскольку вы работаете в Windows, намереваетесь ли вы работать с ISO-8859-1 и Windows-1252? Последнее часто используется по умолчанию для файлов из таких вещей, как Блокнот и Wordpad. В этих случаях дела обстоят еще хуже: эвристически можно различать такие кодировки, другие кодировки и UTF-8.

В библиотеке ICU есть система определения набора символов , которую можно использовать, чтобы угадать вероятную кодировку символов файла. Я не верю, что у iconv есть такая функция.

ICU, как правило, доступен, уже установлен на Mac и Linux, но, увы, не на Windows. Такая подпрограмма также может быть доступна в Win32 API.

2 голосов
/ 18 января 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...