Определить кодировку строки в C / C ++ - PullRequest
5 голосов
/ 23 сентября 2011

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

Спасибо

Ответы [ 2 ]

7 голосов
/ 23 сентября 2011

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

  1. Сначала проверьте, совпадают ли первые несколько байтов с хорошо известными метками порядка байтов (Спецификация) для 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, которые просто не используют старший бит и не имеютлюбые нулевые символы.
3 голосов
/ 23 сентября 2011

Это непростая проблема, и, как правило, она полагается на эвристику, чтобы сделать правильное предположение о том, что такое входная кодировка, которая может быть вызвана относительно безвредными входными данными - например, посмотрите на в этой Википедии.article и Файл Notepad с кодировкой Redux для получения более подробной информации.

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

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

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