Каков набор допустимых первых символов в документе XML? - PullRequest
1 голос
/ 22 августа 2009

Я работаю над некоторым кодом, чтобы определить кодировку символов документа XML, возвращаемого веб-сервером (в данном конкретном случае - RSS-канал). К сожалению, иногда веб-сервер лжет и сообщает мне, что документ является UTF-8, хотя на самом деле это не так, или код генерации стандартного XML-кода на сервере имеет <?xml encoding='UTF-8'?> в начале, но документ содержит недопустимые последовательности байтов UTF-8.

Поскольку у меня нет контроля над сервером, мне нужно заставить свой клиентский код переносить такого рода несоответствия и показывать что-то , даже если некоторые символы не были правильно декодированы. Это важное требование для моего заявления.

Мне хорошо известно, что в этом случае сервер нарушает спецификацию XML. Я пытаюсь поработать с разработчиками на стороне сервера, когда это возможно, чтобы все было корректно в соответствии со спецификацией, но иногда это является низким приоритетом для них или для их организации, или код на стороне сервера никем не поддерживается активно.

Чтобы быть устойчивым, я хочу взглянуть на первые несколько байтов данных XML и попытаться определить, является ли это какой-либо формой UTF-16 или какой-либо 8-битной кодировкой. У меня уже есть код, который ищет метку порядка байтов (* BOM).

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

Очевидно, я должен где-то нарисовать линию. Если документ не является правильно сформированным XML, я все равно не смогу его проанализировать, если не напишу свой собственный очень терпимый синтаксический анализатор (что я не планирую делать). Но, учитывая, что он правильно сформирован, что я мог видеть в первом символе документа, кроме спецификации?

Насколько я могу судить по просмотру спецификации, этот набор будет следующим: пробел (пробел, табуляция, новая строка, возврат каретки) и '<'. Знают ли какие-нибудь эксперты по XML о чем-то, чего мне не хватает? Я должен предположить, что декларация <code><?xml?> может отсутствовать, даже если этого требует спецификация.

Внутренние DTD, инструкции по обработке, теги и комментарии начинаются с '<'. Возможно ли иметь сущность (начиная с '&') или что-то еще в начале документа? </p>

РЕДАКТИРОВАТЬ: переписать, чтобы подчеркнуть мои конкретные требования.

Ответы [ 3 ]

2 голосов
/ 22 августа 2009

Спецификация XML предоставляет некоторые рекомендации об обнаружении кодировок символов. Проблема в том, что почти невозможно взглянуть на первые несколько байтов и сказать, является ли это UTF-8 или ISO-8859-1 или CP437 в этом отношении. Информация, содержащаяся в спецификации, позволит вам по крайней мере различить правильно оформленные документы.

1 голос
/ 22 августа 2009

Проблема в том, что, если фид недействителен, он, вероятно, не подчиняется никаким правилам о допустимых символах. Взгляните на код для Универсального анализатора подачи . Это очень хорошо проверенный код для разбора текста мусора в возможно правильные структуры данных.

UFP использует подбиблиотеку с именем Universal Encoding Detector , которая должна содержать полезную информацию для общего обнаружения кодирования.

0 голосов
/ 22 августа 2009

Это не идеально, но я иногда делаю это, когда мне нужно справиться с неправильными кодировками (оповещение псевдо-кода).

str = decode("utf-8", input)
if (!str) {
  str = decode("cp1252", input)
}

То есть попытайтесь интерпретировать входные данные как UTF-8, и, если они не пройдут, обработайте их как поступающие из системы Windows (что, вероятно, и есть). Мне кажется, это разумный компромисс.

Конечно, для этого требуется сначала загрузить весь ввод в память, что может быть непрактично.

...