Чтение файла с кириллицей - PullRequest
0 голосов
/ 17 февраля 2010

Мне нужно открыть файл с символами кириллицы.Я закодировал файл в utf8.Вот пример:

ru: Разве ваша семья не может позволить себе костюм для вас
ru: Не ваша семья может позволить себе костюм для вас

Как мнеоткрыть файл:

ifstream readFile(fileData.c_str());
while (!readFile.eof())
{
  std::getline(readFile, buffer);
  ...
}

Первая проблема, перед текстом 'en' стоит какой-то символ (я видел это в отладчике):

"ï" ¿en: less "

И еще одна проблема - символы кириллицы:

"ru: нР° именьший"

Что не так?

Ответы [ 4 ]

3 голосов
/ 17 февраля 2010

перед текстом 'en' * стоит какой-то символ

Это искусственная спецификация, результат кодирования символа U + FEFF BYTE ORDER MARK в UTF-8.

Поскольку UTF-8 является кодировкой, у которой нет порядка следования байтов, faux-BOM никогда не следует использовать, но, к сожалению, довольно много существующего программного обеспечения (особенно в мире MS), тем не менее.Загрузите файл сообщений в текстовый редактор и снова сохраните его как UTF-8, используя кодировку «UTF-8 без BOM», если он указан в списке.

ru: нР° именьший

Это то, что вы получаете, когда получаете байтовую строку UTF-8 (представляющую наименьший), и вы печатаете ее, как если бы она была кодовой страницей 1252 (Windows Western European)строка байтов.Это не проблема ввода;Вы прочитали строку OK и получили строку байтов UTF-8.Но затем, в коде, который вы не указали, он выводится как cp1252.

Если вы просто печатаете его на консоль, этого следует ожидать, так как консоль всегда использует системную кодовую страницу по умолчанию(1252 на западной установке Windows), а не UTF-8.Если вам нужно отправить Unicode на консоль, вам придется преобразовать байты в native-Unicode wchar s и записать их оттуда.Я не знаю, каким будет конечный пункт назначения для ваших строк ... если вы просто собираетесь записать их в другой файл или что-то еще, вы можете просто сохранить их в байтах и ​​не заботиться о том, в какой кодировке они находятся.

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

Я полагаю, что ваша ОС Windows.Существует несколько простых способов:

  1. Использование wchar_t, wstring, wifstream и т. д.
  2. Использование библиотеки icu
  3. Использование другой библиотеки super puper (их действительно много)

Примечание: для печати с консоли вы должны использовать функции WinApi для преобразования UTF-8 в cp866 (моя кодировка кириллицы Windows по умолчанию cp1251), поскольку консоль windows поддерживает только кодировки dos.

Примечание: дляДля печати файла вам необходимо знать, в какой кодировке используется ваш файл

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

Используйте icu для преобразования текста.

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

Используйте libiconv для преобразования текста в пригодную для использования кодировку после чтения.

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