Как сказал Филип, кодировка не является внутренним атрибутом файла; Это неявно. Это означает, что, если вы не знаете, в какой кодировке должен интерпретироваться файл, определить его невозможно. Лучшее, что вы можете сделать, это сделать предположение. Это, вероятно, то, что делают такие программы, как Notepad ++. Поскольку фактические данные, которые вы отправили, могут интерпретироваться во многих различных кодировках, он просто выбирает кандидата, который ему нравится больше всего. Для Notepad ++ это выглядит как ANSI (что само по себе является довольно неточной классификацией), тогда как другие программы могут по умолчанию использовать что-то еще.
Причина, по которой вы должны указать кодировку в HTTP-заголовке, заключается именно в том, что сам файл не содержит эту информацию, поэтому браузер должен быть проинформирован об этом. После сохранения файла на диск эта информация становится недоступной.
Если файл, который вы собираетесь обслуживать, является XML-документом, у вас есть возможность поместить информацию о кодировке в фактический документ. Таким образом, он сохраняется после сохранения файла на диск. Например. если вы используете utf-8, вы должны поместить это в верхней части документа:
<?xml version="1.0" encoding="utf-8" ?>
Обратите внимание, что помимо передачи мета-информации о кодировке, вам также необходимо убедиться, что данные, которые вы обслуживаете, действительно кодируются в формате utf-8. Это почти тот же сценарий: вам нужно неявно знать, в какой кодировке находятся ваши данные. Функция utf8_encode
(несмотря на название) явно предназначена для преобразования iso-8859-1 в utf-8. Таким образом, если вы используете его для уже кодированных данных utf-8, вы получите его в двойном кодировании с результатом искаженных данных.
Кодировки не так уж сложны сами по себе. Проблема в том, что, если вы не будете осторожны, вы все испортите. Всякий раз, когда у вас есть строка, вы должны быть абсолютно уверены, что знаете, в какой кодировке она находится. В противном случае это не строка - это просто двоичный объект двоичных данных.