На этот вопрос уже есть миллион ответов, и многие из них довольно хороши, но я хотел попытаться уточнить, когда спецификацию следует или не следует использовать.
Как уже упоминалось, любое использование спецификации UTF (метки порядка байтов) при определении того, является ли строка UTF-8 или нет, представляет собой сложную догадку. Если доступны правильные метаданные (например, charset="utf-8"
), то вы уже знаете, что должны использовать, но в противном случае вам нужно будет проверить и сделать некоторые предположения. Это включает проверку, начинается ли файл с строки, начинается с шестнадцатеричного байтового кода, EF BB BF.
Если найден байт-код, соответствующий спецификации UTF-8, вероятность достаточно высока, чтобы предположить, что это UTF-8, и вы можете перейти оттуда. Однако, если сделать такое предположение, дополнительная проверка ошибок во время чтения все равно будет хорошей идеей на случай, если что-то искажается. Вы должны только предполагать, что спецификация не UTF-8 (то есть латинская-1 или ANSI), если входной сигнал определенно не должен быть UTF-8 на основе его источника. Однако, если спецификации нет, вы можете просто определить, должен ли она быть UTF-8, проверив ее по кодировке.
Почему не рекомендуется спецификация?
- Программное обеспечение, не поддерживающее Юникод или плохо совместимое, может предполагать, что оно латинское-1 или ANSI, и не удаляет спецификацию из строки, что, очевидно, может вызвать проблемы.
- Это на самом деле не нужно (просто проверьте, соответствует ли содержимое, и всегда используйте UTF-8 в качестве запасного варианта, когда не удается найти совместимую кодировку)
Когда следует кодировать с помощью спецификации?
Если вы не можете записать метаданные любым другим способом (через тег charset или мета файловой системы) и программы, используемые как спецификации, вам следует кодировать с помощью спецификации. Это особенно верно в Windows, где обычно предполагается, что что-либо без спецификации использует устаревшую кодовую страницу. Спецификация сообщает таким программам, как Office, что да, текст в этом файле - Unicode; вот используемая кодировка.
Когда дело доходит до этого, единственные файлы, с которыми у меня действительно возникают проблемы, это CSV. В зависимости от программы, она должна или не должна иметь спецификацию. Например, если вы используете Excel 2007+ в Windows, он должен быть закодирован с помощью спецификации, если вы хотите открыть ее плавно и не прибегать к импорту данных.