我正在读取一个用iso-8859-1编码的xml文档。这种编码也在documtent:<?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 */
}
}发布于 2019-01-04 18:46:28
您是正确的,您将需要手动将其从utf-8转换为iso-8859-1,然后将其从XML中提取出来。我知道,这实际上是“加倍工作”,因为它被转换了两次,最终返回到原来的编码,但是转换到UTF-8是libxml解析过程中不可或缺的一部分,没有办法告诉它不这样做。
好的一面是,如果您正在消费的内容突然更改为UTF-8或UTF-16或任何其他字符集,您的“从libxml获取它并隐藏到iso-8859-1”代码仍将正常工作。
https://stackoverflow.com/questions/54034343
复制相似问题