TinyXML разбирает многобайтовые символы, но пропускает следующие [x] символы

У меня есть программа на С ++, которая получает некоторый 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 символа в этом случае?

2

Решение

<?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, сервер должен предоставить эту информацию. Если это не так, то это ошибка на сервере.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]