Учитывая строку в виде указателя на массив байтов (символов), как я могу определить кодировку строки в C/C++ (я использовал визуальную студию 2008)?? Я сделал поиск, но большинство примеров сделано на С#.
Спасибо
Учитывая строку в виде указателя на массив байтов (символов), как я могу определить кодировку строки в C/C++ (я использовал визуальную студию 2008)?? Я сделал поиск, но большинство примеров сделано на С#.
Спасибо
Предполагая, что вы знаете длину входного массива, вы можете сделать следующие предположения:
0x80
до 0xff
, это точно не ASCII или UTF-7. Если вы ограничиваете свой ввод каким-либо вариантом Unicode, вы можете предположить, что это UTF-8. В противном случае вам придется сделать некоторые предположения, чтобы определить, какой это многобайтовый набор символов. Это будет не весело.Это непростая задача, и обычно она опирается на эвристику, чтобы сделать наилучшее предположение о кодировке входных данных, которая может быть сбита с толку относительно безобидными входными данными — например, взгляните на эта статья в Википедии и Файл Блокнота, кодирующий Redux, чтобы узнать больше.
Если вы ищете решение только для Windows с минимальными зависимостями, вы можете использовать комбинацию IsTextUnicode и DetectInputCodePage, чтобы попытаться определить набор символов.
Если вы ищете портативность, но не возражаете против довольно большой зависимости в виде ICU, вы можете использовать его обнаружение набора символов для достижения того же самого переносимым способом.
Я написал небольшую библиотеку C++ для определения кодировки текстового файла. Он использует Qt, но его можно так же легко реализовать, используя только стандартную библиотеку.
Он работает, измеряя статистику появления символов и сравнивая ее с предварительно вычисленными эталонными значениями в разных кодировках и на разных языках. В результате он определяет не только кодировку, но и язык текста. Недостатком является то, что для правильного определения целевым языком необходимо предоставить предварительно вычисленную статистику.
https://github.com/VioletGiraffe/text-encoding-detector