2010-06-08 10 views
0

J'ai un objet DOMNode Xerces (2.6) codé UTF-8. Je l'utilise pour lire son élément de texte comme ceci:Sérialisation de caractères chinois avec Xerces 2.6

CBuffer DomNodeExtended::getText(const DOMNode* node) const { 
    char* p = XMLString::transcode(node->getNodeValue()); 
    CBuffer xNodeText(p); 
    delete p; 
    return xNodeText; 
} 

Où CBuffer est, bien, juste un objet tampon qui est persisté ces derniers temps car il est dans un DB.

Cela fonctionne jusqu'à ce que dans le TEXTE il n'y ait que des caractères ASCII communs. Si nous avons des chinois, ils se perdent dans l'opération transcode.

J'ai beaucoup cherché sur Google pour trouver une solution. On dirait qu'avec Xerces 3, la classe DOMWriter devrait résoudre le problème. Avec Xerces 2.6 j'essaye XMLTranscoder, mais pas encore de succès. Quelqu'un pourrait-il aider?


Modifier Il semble que je me trompais et la classe DOMWriter est déjà disponible en Xerces 2.6. J'essaie maintenant une solution basée dessus.

Répondre

1

Je l'ai maintenant résolu comme suit. Je ne suis toujours pas sûr que ce soit la solution optimale si

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

N'utilisez pas la méthode de transcodage. La documentation indique clairement qu'elle traduit le texte sur la «page de code native», ce qui est presque toujours une opération avec perte.

Questions connexes