XMLString::transcode的目的是什么?

19
我似乎不理解XMLString::transcode(XMLCh*)和XMLString::transcode(char*)的目的,因为我显然不了解XMLCh*和char*之间的区别。能否有人给我更清晰地解释一下?
2个回答

31

Xerces在内部将信息编码为UTF-16。UTF-16数据使用XMLCh数据类型存储。

"C风格"的字符串使用char,它位于本地代码页中(可能是UTF-8,但这取决于平台和设置)。您可以使用transcode在两者之间进行转换。

例如,如果您想从Xerces传递一些数据给另一个库,并且该库希望使用本地代码页中的文本,则需要进行transcode。此外,如果您拥有char数据并希望将其传递给Xerces,则需要将其transcodeXMLCh,因为这是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和字符集知识(没有借口!)》


在示例中添加几行代码将对像我这样的其他读者非常有帮助! - Jaywalker

0

有点不要紧,因为我错误地尝试对一个仅被强制转换为XMLCh*的char*进行转码。在这种情况下,转码失败了,但是下面的代码成功了。如下所示,xmlch_abc代表(XMLCh*)char*。这个答案是为了给其他人提供帮助,如果他们也遇到了同样不寻常的情况,程序崩溃是由于操作失误造成的。

TranscodeToStr tts(xmlch_abc,"utf-16");
const unsigned char * chstr = tts.str();

std::cout<<chstr<<std::endl;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接