我有一个Xerces(2.6)DOMNode对象编码的UTF-8。我用它来读取它的TEXT元素:
CBuffer DomNodeExtended::getText( const DOMNode* node ) const {
char* p = XMLString::transcode( node->getNodeValue( ) );
CBuffer xNodeText( p );
delete p;
return xNodeText;
}
其中,CBuffer只是一个缓冲对象,它最近被保存在数据库中。
直到TEXT中只有常见的ASCII字符。如果我们有中国人,他们会在transcode
操作中迷路。
我已经google了很多寻求解决方案。看起来像Xerces 3,DOMWriter类应该解决问题。使用Xerces 2.6我正在尝试XMLTranscoder,但还没有成功。有人可以帮忙吗?
编辑 它看起来我错了,并且Xerces 2.6中已经提供了DOMWriter类。我现在正在尝试基于它的解决方案。
答案 0 :(得分:2)
请勿使用转码方法。文档明确指出它将文本转换为“本机代码页” - 这几乎总是有损操作。
答案 1 :(得分:1)
我现在解决了以下问题。我仍然不确定这是否是最佳解决方案
CBuffer DomNodeExtended::getText( const DOMNode* node ) const
{
XMLCh tempStr[100];
XMLString::transcode("LS", tempStr, 99);
DOMImplementation *impl =
DOMImplementationRegistry::getDOMImplementation(tempStr);
DOMWriter* myWriter = ((DOMImplementationLS*)impl)->createDOMWriter();
XMLCh *strNodeValue = myWriter->writeToString(*node);
XMLTransService::Codes resCode;
XMLTranscoder* t =
XMLPlatformUtils::fgTransService->makeNewTranscoderFor(
"UTF-8", resCode, 16*1024);
unsigned int charsEaten = 0;
unsigned int charsReturned = 0;
char bytesNodeValue[16*1024+4];
charsReturned = t->transcodeTo( strNodeValue,
XMLString::stringLen(strNodeValue),
(XMLByte*) bytesNodeValue,
16*1024,
charsEaten,
XMLTranscoder::UnRep_Throw);
CBuffer xNodeText( bytesNodeValue, charsReturned);
XMLString::release(&strNodeValue);
myWriter->release();
delete t;
return xNodeText;
}