Несколько лет назад у нас было обнаружение набора символов для почтового приложения, и мы развернули свое собственное. Почтовое приложение фактически было WAP-приложением, и телефон ожидал UTF-8. Было несколько шагов:
Универсальная
Мы могли бы легко определить, был ли текст UTF-8, так как в старших битах байтов 2/3 / и т. Д. Есть определенный битовый шаблон. Когда вы обнаружили, что этот шаблон повторяется определенное количество раз, вы можете быть уверены, что это был UTF-8.
Если файл начинается с метки порядка байтов UTF-16, вы, вероятно, можете предположить, что остальная часть текста - это кодировка. В противном случае, обнаружение UTF-16 не так просто, как UTF-8, если только вы не можете обнаружить шаблон суррогатных пар: но использование суррогатных пар встречается редко, поэтому обычно это не работает. UTF-32 похож, за исключением того, что нет суррогатных пар для обнаружения.
Региональное обнаружение
Далее мы предполагаем, что читатель находится в определенном регионе. Например, если пользователь видел пользовательский интерфейс, локализованный на японском языке, мы могли бы попытаться обнаружить три основных японских кодировки. ISO-2022-JP снова восток для обнаружения с помощью escape-последовательностей. Если это не удается, определить разницу между EUC-JP и Shift-JIS не так просто. Скорее всего, пользователь получит текст Shift-JIS, но в EUC-JP есть символы, которых нет в Shift-JIS, и наоборот, поэтому иногда вы можете получить хорошее совпадение.
Та же процедура была использована для китайских кодировок и других регионов.
Выбор пользователя
Если они не дали удовлетворительных результатов, пользователь должен вручную выбрать кодировку.