我正在阅读以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 */
}
}
答案 0 :(得分:1)
您是正确的,从XML api中获取后,需要将其从utf-8手动转换为iso-8859-1。我知道这有效地“加倍了工作”,因为它被转换了两次,只是返回到原始编码,但是转换为UTF-8是libxml解析过程不可或缺的一部分,并且没有办法告诉它不这样做。
好的一面是,如果您正在使用的内容突然更改为UTF-8或UTF-16或任何其他字符集,则您的“从libxml中获取并秘密转换为iso-8859-1”代码仍然可以使用正确地