2016-07-07 2 views
-2

I`m пытается открыть существующий файл и прочитать, например:Как я могу найти и изменить кодировку существующего файла?

std::string text = fileOpenRead(readonly, filePath); 

Тогда я хочу, чтобы изменить кодировку string «s в UTF-8 и сохраните его.

Итак, мне нужны два API:

  1. Найти существующую кодировку файла.

  2. Преобразование данных из вышеуказанной кодировки в UTF-8.

Я искал Google и StackOverflow, но я не могу найти идеальное решение.

Может кто-нибудь поделится некоторыми советами со мной?

+0

Невозможно надежно угадать кодировку файла. Нажмите самую верхнюю тему в разделе 'related' в правой части для [Как определить кодировку/кодовую страницу текстового файла] (http://stackoverflow.com/questions/90838/how-can-i-detect-the -encoding-кодовая-оф-а-текстовый файл). – dxiv

ответ

0

Нет ничего о конкретном файле, который указывает его кодировку универсальным образом, применимым ко всем операционным системам в мире.

Отдельные операционные системы могут предоставлять метаданные, специфичные для файлов, которые определяют, какой контент в файле; как то, что кодирует текстовый файл.

Но нет ничего в стандартной библиотеке C++, которая возвращает кодировку произвольного файла.

1

Шаг № 1 является очень трудно выполнить, если файл не использует кодировку UTF, как UTF-8 или UTF-16 (UTF-8 очень легко обнаружить, и UTF-16 также достаточно легко в некоторой степени, если спецификация отсутствует).

Есть много кодировок, используемых в мире (Unicode был разработан, чтобы заменить их всех, но эта цель не была достигнута 100% еще в мире), и многие не-ASCII кодировка не может точно быть обнаружена без контекста, или предварительное знание кодировки, которая была использована для создания файла. Если вы не можете запросить у пользователя конкретную кодировку, вам придется прибегнуть к эвристическому анализу данных (и если вы будете искать их, есть некоторые библиотеки обнаружения набора символов сторонних разработчиков), и это может быть подвержено ошибкам без контекстной информации.

Смотреть это:

The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

без контекста, одни и те же данные могут быть интерпретированы по-разному, производя различные результаты. Например, такая проблема затрагивает что-то как «простое», как «Блокнот» в Windows, когда необходимо предусмотреть кодировку файла. Это хороший пример того, как гадать, может пойти не так:

Notepad bug? Encoding issue?

Some files come up strange in Notepad

The Notepad file encoding problem, redux

Bush hid the facts

Независимо от того, насколько хороши ваши эвристика может быть, вы все еще гадать, и угадывание не на 100% надежнее.Так что сделайте себе одолжение и не угадайте вообще.

Что касается этапа № 2, то после определения исходной кодировки вы должны использовать переносимую библиотеку Unicode для преобразования из этой кодировки в UTF-8, например libiconv или ICU.

Смежные вопросы