См. Спецификация XML 1.0 , раздел «F Автоматическое обнаружение кодировок символов (ненормативный раздел»):
Объявление кодирования XML функционирует как внутренняя метка для каждого объектауказывает, какая кодировка символов используется.Однако прежде чем XML-процессор сможет прочитать внутреннюю метку, он, очевидно, должен знать, какая кодировка символов используется - именно это пытается указать внутренняя метка.В общем случае это безнадежная ситуация.Однако в XML это не совсем безнадежно, поскольку XML ограничивает общий случай двумя способами: предполагается, что каждая реализация поддерживает только конечный набор кодировок символов, а объявление кодировки XML ограничено по позиции и содержанию чтобы сделать возможным автоматическое определение кодировки символов, используемой в каждом объекте в обычных случаях.
И:
Поскольку каждый объект XML не сопровождается внешним кодированиеминформация, а не в кодировке UTF-8 или UTF-16, должна начинаться с объявления кодировки XML, в котором первые символы должны быть <?xml
, любой соответствующий процессор может обнаружить после двух-четырех октетов ввода, что в следующих случаяхapply.
And:
Поскольку содержимое объявления кодировки ограничено символами из репертуара ASCII (как бы он ни был закодирован), процессор может надежно прочитать всю кодировкудекларация, как только он обнаружил, какое семейство кодировокиспользуется.
Итак, какое бы кодирование ни использовалось, совместимый синтаксический анализатор должен иметь возможность автоматически определять кодировку, используемую для документа, и анализировать фактическое значение атрибута «кодировка».
После прочтения парсеру, возможно, придется сбросить поток и использовать другое средство чтения, чтобы правильно прочитать весь документ.