Я хотел бы разобрать XML в формате UTF8 с помощью libXML2. Мой код написан на C, и я использую v2.9.3 из libXML2.
Мой код следует:
xmlTextReaderPtr reader;
xmlTextWriterPtr writer;
writer = xmlNewTextWriterFilename("test.xml", 0);
xmlTextWriterStartDocument(writer, NULL, "UTF-8", NULL);
xmlTextWriterStartElement(writer, BAD_CAST "node_with_é_character");
xmlTextWriterEndElement(writer);
xmlTextWriterEndDocument(writer);
xmlFreeTextWriter(writer);
reader = xmlReaderForFile("test.xml", "UTF-8", XML_PARSE_RECOVER);
int ret = 1;
while (ret == 1) {
const xmlChar *nameT = xmlTextReaderConstName(reader);
printf("\n ---> %s\n",nameT);
ret = xmlTextReaderRead(reader);
}
Выход:
---> (null)
---> node_with_é_character
Проблема заключается в трассировке "node_with_Ã ©_character", а не "node_with_é_character"
Моя командная строка - "chcp 1252" set.
Я не понимаю, почему liXML2 не может хранить / читать символ «é».
Да, я использую Windows с mingw.
Символ «é» сохраняется с двумя байтами C3 A9. Если эти два байта интерпретируются (декодируются) с помощью Latin-1 или другой подобной кодовой страницы Windows, вместо этого вы получаете «Ã ©». Поэтому я думаю, что ваш код в порядке, но ваш инструмент терминала / командной строки (который получает вывод вашей программы и отображает его) ошибается. Вы должны установить кодировку интерфейса командной строки в UTF-8.

Как указано в комментарии к вашему под Windows, я предполагаю, что, вероятно, ваш исходный код не закодирован в UTF-8, поэтому строка C «node_with_é_character» не закодирована в UTF-8 в вашем исполняемом файле.
Я не знаю интерфейсов libxml2, но пример кода довольно ясен, он ожидает входные параметры в UTF-8. См. http://xmlsoft.org/examples/testWriter.c
/* Write a comment as child of EXAMPLE.
* Please observe, that the input to the xmlTextWriter functions
* HAS to be in UTF-8, even if the output XML is encoded
* in iso-8859-1 */
tmp = ConvertInput("This is a comment with special chars: <\xE4\xF6\xFC>",
MY_ENCODING);
Сохраните исходный файл как UTF-8, чтобы решить вашу проблему.
Ты прав. Задайте для командной строки «chcp 65001» и преобразование исходного файла в UTF-8 решило проблему. Спасибо
Вы работаете в Windows, не так ли?