LibXML xmlTextReaderReadString编码

时间:2019-01-04 06:56:50

标签: encoding libxml2

我正在阅读以iso-8859-1编码的xml文档。在以下文档中也描述了这种编码: <?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。 如何在iso-8859-1中获取elem_value?我有手动转换吗?

这是我的尝试:

        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 :(得分:1)

您是正确的,从XML api中获取后,需要将其从utf-8手动转换为iso-8859-1。我知道这有效地“加倍了工作”,因为它被转换了两次,只是返回到原始编码,但是转换为UTF-8是libxml解析过程不可或缺的一部分,并且没有办法告诉它不这样做。

好的一面是,如果您正在使用的内容突然更改为UTF-8或UTF-16或任何其他字符集,则您的“从libxml中获取并秘密转换为iso-8859-1”代码仍然可以使用正确地