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 は、DB にあるように最近永続化される単なるバッファ オブジェクトです。

これは、一般的な ASCII 文字だけが TEXT に含まれるまで機能します。私たちが中国のものを持っている場合、彼らは操作で迷子になり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 に答える