Вопрос по character-encoding, ide, utf-8 – Определить кодировку UTF-8 (как это делает MS IDE)?
==============================================================================================

Проблема с различными кодировками символов заключается в том, что содержащийся файл не всегда четко обозначен. Существуют противоречивые соглашения для маркировки некоторых с использованием «меток порядка следования байтов». или спецификации. Но по сути вы должны бытьtold что такое кодировка файла, чтобы прочитать его точно.

Мы создаем инструменты программирования, которые читают исходные файлы, и это дает нам горе. У нас есть средства для определения значений по умолчанию, сниффинга для спецификаций и т. Д. И мы довольно хорошо справляемся с соглашениями и значениями по умолчанию. Но место, где мы (и я полагаю, все остальные) зацикливаются на файлах UTF-8, которые не помечены как BOM.

Последние MS IDE (например, VS Studio 2010), по-видимому, будут "нюхать" файл, чтобы определить, закодирован ли он в кодировке UTF-8 без спецификации. (Находясь в сфере инструментов, мы хотели бы быть совместимыми с MS из-за их доли на рынке, даже если это означает необходимость пересекать с ними «тупой» утес.) Я особенно заинтересован в том, что они используют как эвристика (хотя обсуждение эвристики в порядке)? Как это может быть "правильно"? (Рассмотрим строку в кодировке ISO8859-x, интерпретированную таким образом).

РЕДАКТИРОВАТЬ: Эта статья об обнаружении кодировок / наборов символов довольно интересна:
[http://www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html](https://www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html)

РЕДАКТИРОВАТЬ Декабрь 2012: Мы прекратили сканирование всего файла, чтобы увидеть, нет ли в нем каких-либо нарушений последовательностей UTF-8 ... и если нет, мы называем его UTF-8. Плохая часть этого решения заключается в том, что вам придется обрабатывать символы дважды, если это UTF-8. (Если это не UTF-8, этот тест, скорее всего, определит это довольно быстро, если только файл не встречается со всеми 7-битными ASCII, в которых чтение, такое как UTF-8, не повредит).

По сути, когда вы не знаете кодировку файла / потока / источника, вам необходимо проверить весь файл и / или найти фрагменты текста, чтобы убедиться, что вы получаете совпадения UTF-8. Я вижу, что это похоже на то, что делают некоторые антивирусные продукты, проверяя части известных вирусных подстрок

Возможно, я бы посоветовал вам применить вызов к функции, аналогичной той, которую мы делали при чтении файла / потока, построчно, чтобы определить, найдена ли кодировка UTF-8 или нет

Пожалуйста, обратитесь к нашему сообщению ниже

Ref.
- <https://stackoverflow.com/questions/17283872/how-to-detect-utf-8-based-encoded-strings>



 первый символ, который вы видите более 0x7F, должен быть началом последовательности UTF-8. Так что проверь это. Вот код, который мы используем для этого:

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