Ошибка при анализе файла Xml с помощью RapidXML

У меня возникает ошибка «parse_error», когда я пытаюсь проанализировать файл xml, содержащий определенные японские иероглифы:

退

Если я поменяю этот кандзи на другой, синтаксический анализ будет работать хорошо.

Любая идея?

PS: я разбираю файл с помощью rapidXML

Вот пример xml-файла:

<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Exam.xsd">
    <Patient>
     <ESUID>CRodrigueTest-20120423-104410</ESUID>
     <Lastname>退</Lastname>
    </Patient>
</Root>

person Rodrigue Rens    schedule 20.04.2012    source источник


Ответы (1)


Здесь на самом деле проблема не в библиотеке rapidXML. Проблема может быть связана с basic_ifstream.basic_ifstream, поскольку по умолчанию файл открывается только в режиме ansi. Поэтому мы должны установить его в utf-8. Используйте приведенный ниже фрагмент кода:

    basic_ifstream<wchar_t> fFileStream(fullxmlfilepath, ios::binary);

    std::locale loc(std::locale::classic(), new std::codecvt_utf8<wchar_t>);
    fFileStream.imbue(loc);  

    xmlFile = new rapidxml::file<wchar_t>(fFileStream);
    doc.parse<parse_declaration_node>(xmlFile ->data());
person Jayesh Vaghasiya    schedule 19.08.2016
comment
Это неправильно на нескольких уровнях: OP использует UTF-8, а не UTF-16 или 32. UTF-8 (и, следовательно, все кодовые точки Unicode, включая японский, китайский и т. д.) полностью поддерживается rapidxml, поэтому нет нужно использовать другую библиотеку. - person Roddy; 06.10.2016
comment
Да, ты прав, Родди. На самом деле я нашел основную причину этой проблемы. Проблема не в библиотеке rapidxml. В моем случае проблемы были в basic_ifstream. По умолчанию basic_ifstream открывает файл только в режиме ansi. Поэтому нам нужно открыть его в режиме utf-8. - person Jayesh Vaghasiya; 14.11.2016
comment
Добавьте ниже строки кода в существующий поток. std::locale loc(std::locale::classic(), новый std::codecvt_utf8‹wchar_t›); XMLFileStream.imbue(loc); - person Jayesh Vaghasiya; 14.11.2016