Не будет абсолютно надежного способа, но вы можете получить «довольно хороший» результат с некоторыми эвристиками.
- Если данные начинаются с спецификации, используйте ее.
- Если данные содержат 0 байтов, скорее всего это utf-16 или ucs-32.Вы можете различить их и варианты их с прямым и младшим порядком байтов, посмотрев на позиции 0-байтов
- Если данные могут быть декодированы как utf-8 (без ошибок),тогда вполне вероятно, что utf-8 (или US-ASCII, но это подмножество utf-8)
- Далее, если вы хотите выйти на международный уровень, сопоставьте языковые настройки браузера с наиболее вероятной кодировкой дляэтот язык.
- Наконец, предположим, что ISO-8859-1
То, достаточно ли «довольно хорошо» «достаточно хорошо», конечно, зависит от вашего приложения.Если вам нужно быть уверенным, вы можете отобразить результаты в виде предварительного просмотра и позволить пользователю подтвердить, что данные выглядят правильно.Если это не так, попробуйте следующую вероятную кодировку, пока пользователь не будет удовлетворен.
Примечание : этот алгоритм не будет работать, если данные содержат символы мусора.Например, один мусорный байт в действующем в противном случае utf-8 приведет к сбою декодирования utf-8, что заставит алгоритм пойти по неверному пути.Возможно, вам придется принять дополнительные меры для решения этой проблемы.Например, если вы можете заранее определить возможный мусор, удалите его, прежде чем пытаться определить кодировку.(Неважно, если вы снимаете слишком агрессивно, после того, как вы определили кодировку, вы можете декодировать исходные необработанные данные, просто настроить декодеры для замены недопустимых символов вместо того, чтобы выдавать исключение.) Или считать ошибки декодирования и взвешивать их соответствующим образом,Но это, вероятно, во многом зависит от характера вашего мусора, то есть от того, какие предположения вы можете сделать.