WedX - журнал о программировании и компьютерных науках

Определить кодировку строки в C/C++

Учитывая строку в виде указателя на массив байтов (символов), как я могу определить кодировку строки в C/C++ (я использовал визуальную студию 2008)?? Я сделал поиск, но большинство примеров сделано на С#.

Спасибо


  • Какие возможные кодировки вы ожидаете? Есть ли небольшой набор возможных вариантов или может быть любой? 23.09.2011
  • Какую среду вы используете? Я думаю, что для Linux есть библиотека, переносимая на Windows. 23.09.2011
  • Всем спасибо, K-ballo, Kerrek: это может быть UTF8, UCS2/UTF16 или ANSI; AlbertPerrien: Я использую Windows, кстати, как называется библиотека? 23.09.2011

Ответы:


1

Предполагая, что вы знаете длину входного массива, вы можете сделать следующие предположения:

  1. Во-первых, проверьте, совпадают ли первые несколько байтов с известными метками порядка следования байтов (BOM) для Unicode< /а>. Если они это сделают, вы сделали!
  2. Затем найдите «\0» перед последним байтом. Если вы найдете его, возможно, вы имеете дело с UTF-16 или UTF-32. Если вы найдете несколько последовательных '\0', это, вероятно, UTF-32.
  3. Если какой-либо символ находится в диапазоне от 0x80 до 0xff, это точно не ASCII или UTF-7. Если вы ограничиваете свой ввод каким-либо вариантом Unicode, вы можете предположить, что это UTF-8. В противном случае вам придется сделать некоторые предположения, чтобы определить, какой это многобайтовый набор символов. Это будет не весело.
  4. На данный момент это либо: ASCII, UTF-7, Base64, либо диапазоны UTF-16 или UTF-32, которые просто не используют верхний бит и не содержат нулевых символов.
23.09.2011

2

Это непростая задача, и обычно она опирается на эвристику, чтобы сделать наилучшее предположение о кодировке входных данных, которая может быть сбита с толку относительно безобидными входными данными — например, взгляните на эта статья в Википедии и Файл Блокнота, кодирующий Redux, чтобы узнать больше.

Если вы ищете решение только для Windows с минимальными зависимостями, вы можете использовать комбинацию IsTextUnicode и DetectInputCodePage, чтобы попытаться определить набор символов.

Если вы ищете портативность, но не возражаете против довольно большой зависимости в виде ICU, вы можете использовать его обнаружение набора символов для достижения того же самого переносимым способом.

23.09.2011

3

Я написал небольшую библиотеку C++ для определения кодировки текстового файла. Он использует Qt, но его можно так же легко реализовать, используя только стандартную библиотеку.

Он работает, измеряя статистику появления символов и сравнивая ее с предварительно вычисленными эталонными значениями в разных кодировках и на разных языках. В результате он определяет не только кодировку, но и язык текста. Недостатком является то, что для правильного определения целевым языком необходимо предоставить предварительно вычисленную статистику.

https://github.com/VioletGiraffe/text-encoding-detector

26.09.2020
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]