У меня есть программа на С ++, которая получает некоторый XML-файл с сервера, а затем пытается проанализировать его, чтобы заполнить некоторые поля со списком, например
<?xml version="1.0"?>
<CustomersMachines>
<Customer name="bob" id="1">
<Machine name="office1" id="1" />
<Machine name="officeserver" id="2" />
</Customer>
</CustomersMachines>
Для этих значений TinyXML выполняет синтаксический анализ, и результирующие поля со списками заполняются, как предполагалось. Проблема возникает, когда многобайтовый символ помещается в (или рядом, в зависимости от количества байтов) конец элемента имени.
<Customer name="boß" id="3">
приведет к заполнению поля со списком значением boß «id =
По шагам через отладчик я вижу, что, когда многобайтовый символ передается в ReadText (), следующие 1-3 однобайтовых символа в элементе пропускаются, но автоматически включаются, поэтому tinyXML не регистрирует закрывающую кавычку и сохраняет Разбор, пока не достигнет следующего. Приложение, работающее на сервере, отправляющем xml, преимущественно использует кодировку ISO-8859-1, тогда как tinyXML по умолчанию использует UTF-8.
Я попытался настроить tinyxml по умолчанию, чтобы использовать TIXML_ENCODING_UNKNOWN, которая, кажется, решает проблему, но вызывает значительное количество проблем в других частях программы. Другие вещи, которые я пробовал, — это utf8_encode на стороне сервера xml перед отправкой (но это приводит к отображению странных символов в выпадающих списках, где должен быть многобайтовый символ), и принудительное кодирование в xml, отправляемое на Клиентская программа безрезультатна.
Кто-нибудь имеет представление о том, как запретить многобайтовым символам автоматически игнорировать следующие 1-3 символа в этом случае?
<?xml?>
Пролог не указывает кодировку. Если кодировка недоступна за пределами XML с помощью внеполосных средств, то кодирование необходимо угадать путем анализа начальных байтов XML в соответствии с правилами, изложенными в Приложение F спецификации XML. В этом случае это может привести к выбору UTF-8. Если XML на самом деле не в кодировке UTF-8, это будет учитывать поведение, которое вы видите.
В ISO-8859-1, ß
кодируется как байтовый октет 0xDF
, а также "
кодируется как байтовый октет 0x22
,
В UTF-8, 0xDF
является начальным байтом двухбайтовой последовательности октетов, которая учитывает "
пропускается. Тем не мение, 0xDF 0x22
не является допустимой 2-октетной байтовой последовательностью UTF-8, поэтому TinyXml должен был выполнить синтаксический анализ с ошибкой. Если это не так, то это ошибка в TinyXml.
Если XML на самом деле в кодировке ISO-8859-1, сервер должен предоставить эту информацию. Если это не так, то это ошибка на сервере.
Других решений пока нет …