2010-06-08 3 views
0

Xerces (2.6) DOMNode 객체가 UTF-8로 인코딩되어 있습니다. 나는 이런 식의 TEXT 요소를 읽기 위해 사용 CBuffer가있다Xerces 2.6으로 중국어 문자 직렬화

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

아니라, 요즘은 DB에서와 같이 유지됩니다 단지 버퍼 객체입니다.

이 텍스트는 텍스트에서 단지 일반적인 ASCII 문자가있을 때까지 작동합니다. 예를 들어 중국어를 사용하는 경우 transcode 작업에서 길을 잃게됩니다.

나는 많은 해결책을 찾고자했습니다. Xerces 3처럼 보이면 DOMWriter 클래스가 문제를 해결해야합니다. Xerces 2.6에서는 XMLTranscoder를 사용하고 있지만 아직 성공하지 못했습니다. 아무도 도와 줄 수 있니?


편집 그것은 내가 잘못 외모와 DOMWriter 클래스는 이미 Xerces를 2.6에서 사용할 수 있습니다. 나는 지금 그것에 기초한 해결책을 시도하고있다.

답변

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

트랜스 코드 방식을 사용하지 마십시오. 문서에는 텍스트가 "원시 코드 페이지"로 변환된다는 내용이 명확히 명시되어 있습니다. 이는 거의 항상 손실이 많은 작업입니다.

관련 문제