Сериализация китайских иероглифов с помощью Xerces 2.6 - PullRequest
0 голосов
/ 08 июня 2010

У меня есть объект 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, ну просто буферный объект, который в последнее время сохраняется, как в БД.

Это работает, пока вТЕКСТ там просто обычные символы ASCII.Если у нас есть, например, китайские, они теряются в операции transcode.

Я много гуглил в поисках решения.Похоже, с Xerces 3 класс DOMWriter должен решить проблему.С Xerces 2.6 я пробую XMLTranscoder, но пока безуспешно.Кто-нибудь может помочь?


Править Похоже, я ошибся, и класс DOMWriter уже доступен в Xerces 2.6.Я сейчас пытаюсь найти решение на его основе.

Ответы [ 2 ]

2 голосов
/ 08 июня 2010

Не используйте метод транскодирования. В документации четко указано, что она переводит текст в «собственную кодовую страницу» - что почти всегда является операцией с потерями.

1 голос
/ 08 июня 2010

Я сейчас решил это следующим образом. Я все еще не уверен, что это оптимальное решение, хотя

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;
}
...