Кодировка LibXML xmlTextReaderReadString - PullRequest
0 голосов
/ 04 января 2019

Я читаю XML-документ, который закодирован в iso-8859-1.Эта кодировка также описана в документе: <?xml version="1.0" encoding="ISO-8859-1"?>

Когда я читаю элементы xml, я получаю данные в кодировке utf-8, но мне нужна iso-8859-1 для дальнейшей обработки.

Мой код для чтения файла выглядит следующим образом:

xmlTextReaderPtr reader;
reader = xmlReaderForFile(sessionFileName, "iso-8859-1", 0);
if (reader != NULL)
{
    ret = xmlTextReaderRead(reader);

    while (ret == 1)
    {
        //only inspect start of elements
        if (xmlTextReaderNodeType(reader) != XML_READER_TYPE_ELEMENT)
        {
            ret = xmlTextReaderRead(reader);
            continue;
        }

        //getting node name
        elem_name = xmlTextReaderConstName(reader);

        //getting content of element (text or cdata)
        xmlChar *elem_value = xmlTextReaderReadString(reader);
    }
}

Как я понимаю http://xmlsoft.org/encoding.html, libxml2 хранит все данные внутри себя в utf-8, поэтому elem_value также utf-8,Как я могу получить elem_value в iso-8859-1?Должен ли я конвертировать его вручную?

Это будет моя попытка:

        unsigned char *conv_value;

        if (elem_value)
        {
            int in_size = xmlStrlen(elem_value);
            int out_size  = in_size;

            conv_value = (unsigned char *)malloc((size_t)out_size + 1);

            if (UTF8Toisolat1(conv_value, &out_size, elem_value, &in_size) <= 0 ||
                (in_size - out_size) != 0)
            {
                //error while conversation
                free(conv_value);

                //take original value
                conv_value = elem_value;

                TRACE("error while converting, take utf-8 value");
            }
            else
            {
                conv_value[out_size] = 0; /* null terminating conv_value */
            }
        }

1 Ответ

0 голосов
/ 04 января 2019

Вы правы, вам нужно будет преобразовать его вручную из utf-8 в iso-8859-1 после того, как вы получите его из API XML.Я понял, что это фактически «удваивает работу», поскольку он дважды преобразуется, чтобы в конечном итоге вернуться к исходной кодировке, но преобразование в UTF-8 является неотъемлемой частью процесса синтаксического анализа libxml, и нет способа сказать, что нет.

Плюсом является то, что если содержимое, которое вы потребляете, внезапно меняется на UTF-8 или UTF-16 или любой другой набор символов, ваш код «получить его из libxml и преобразовать в iso-8859-1»все равно будет работать правильно.

...