0

我有一个用 UTF-8 编码的 Xerces (2.6) DOMNode 对象。我用这样的方式读取它的 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

我用谷歌搜索了很多寻找解决方案。看起来在 Xerces 3 中,DOMWriter 类应该可以解决问题。使用 Xerces 2.6 我正在尝试 XMLTranscoder,但还没有成功。有人可以帮忙吗?


编辑看起来我错了,DOMWriter 类已经在 Xerces 2.6 中可用。我现在正在尝试基于它的解决方案。

4

2 回答 2

2

不要使用转码方法。文档清楚地表明它将文本转换为“本机代码页”——这几乎总是一个有损操作。

于 2010-06-08T10:07:55.147 回答
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;
}
于 2010-06-08T15:40:05.833 回答