Обнаружение многобайтовых кодировок символов - PullRequest
2 голосов
/ 20 октября 2011

Какие библиотеки C / C ++ существуют для обнаружения многобайтовой кодировки символов (UTF-8, UTF-16 и т. Д.) Массива символов (char*). Бонусом будет также обнаружение того, когда совпадение остановлено, то есть обнаружение префикса совпадения диапазонов заданного набора возможных кодировок.

Ответы [ 3 ]

5 голосов
/ 20 октября 2011

ICU делает обнаружение набора символов .Вы должны отметить, что, как указано в документации ICU:

Это, в лучшем случае, неточная операция с использованием статистики и эвристики.Из-за этого обнаружение работает лучше всего, если вы предоставляете как минимум несколько сотен байтов символьных данных, которые в основном на одном языке.

2 голосов
/ 20 октября 2011

Если вход только ASCII, нет способа определить, что должно быть сделано, если бы в потоке были байты с высоким битовым значением. В этом случае можно просто выбрать UTF-8.

Что касается UTF-8 по сравнению с ISO-8859-x, вы можете попробовать проанализировать вход как UTF-8 и вернуться к ISO-8859, если анализ не удастся, но это все. На самом деле нет способа определить , какой вариант ISO-8859 существует. Я бы порекомендовал посмотреть, как Firefox пытается автоматически определять, но он не защищен от ошибок и, вероятно, зависит от знания того, что ввод HTML.

1 голос
/ 20 октября 2011

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

Это, конечно, может быть только эвристикой, и вам нужно отсканировать весь текст.

Пример: «английский текст может быть написан в нескольких кодировках».Это предложение может быть написано, например, с использованием немецкой кодовой страницы.Он неотличим от большинства «западных» кодировок (включая UTF-8), если только вы не добавите некоторые специальные символы (например, ä), которых нет в ASCII.

...