LibXML xmlTextReaderReadString 编码
LibXML xmlTextReaderReadString encoding
我正在阅读以 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 */
}
}
你是对的,从XMLapi中取出后,你需要手动将其从utf-8转换为iso-8859-1。我有效地理解了这一点 "doubles the work" 因为它被转换两次只是为了回到原始编码,但是转换为 UTF-8 是 libxml 解析过程的一个组成部分,并且没有办法告诉它不要这样做。
有利的一面是,如果您使用的内容突然更改为 UTF-8 或 UTF-16 或任何其他字符集,您的 "get it from libxml and covert to iso-8859-1" 代码仍然可以正常工作。
我正在阅读以 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 */
}
}
你是对的,从XMLapi中取出后,你需要手动将其从utf-8转换为iso-8859-1。我有效地理解了这一点 "doubles the work" 因为它被转换两次只是为了回到原始编码,但是转换为 UTF-8 是 libxml 解析过程的一个组成部分,并且没有办法告诉它不要这样做。
有利的一面是,如果您使用的内容突然更改为 UTF-8 或 UTF-16 或任何其他字符集,您的 "get it from libxml and covert to iso-8859-1" 代码仍然可以正常工作。