我似乎不理解XMLString::transcode(XMLCh*)和XMLString::transcode(char*)的目的,因为我显然不了解XMLCh*和char*之间的区别。能否有人给我更清晰地解释一下?
Xerces在内部将信息编码为UTF-16。UTF-16数据使用XMLCh
数据类型存储。
"C风格"的字符串使用char
,它位于本地代码页中(可能是UTF-8,但这取决于平台和设置)。您可以使用transcode
在两者之间进行转换。
例如,如果您想从Xerces传递一些数据给另一个库,并且该库希望使用本地代码页中的文本,则需要进行transcode
。此外,如果您拥有char
数据并希望将其传递给Xerces,则需要将其transcode
为XMLCh
,因为这是Xerces所理解的。
例如:
// to local code page
DOMNode *node = ...;
char* temp = XMLString::transcode(node->getNodeValue());
std::string value(temp);
XMLString::release(&temp);
// from local code page
DOMElement *element = ...;
XMLCh *tag = XMLString::transcode("test");
DOMNodeList *list = element->getElementsByTagName(tag);
XMLString::release(&tag);
不要忘记释放字符串!最好的方法是编写一些包装器,但是在互联网上有一些示例(只需搜索名为XercesString
的类)。
如果您想了解更多关于编码的知识,我认为您应该阅读《绝对必须了解的Unicode和字符集知识(没有借口!)》
有点不要紧,因为我错误地尝试对一个仅被强制转换为XMLCh*的char*进行转码。在这种情况下,转码失败了,但是下面的代码成功了。如下所示,xmlch_abc代表(XMLCh*)char*。这个答案是为了给其他人提供帮助,如果他们也遇到了同样不寻常的情况,程序崩溃是由于操作失误造成的。
TranscodeToStr tts(xmlch_abc,"utf-16");
const unsigned char * chstr = tts.str();
std::cout<<chstr<<std::endl;