2016-12-14 8 views
0

XML (UTF-8)이 있습니다. 나는 PugiXML 라이브러리를 사용하여 변수 std::string의 값을 읽어야합니다. 값을 읽은 다음 콘솔에 인쇄하고 있지만 실제 프로젝트에서는 그 값을 PDF에 저장해야합니다 (LibHaru 라이브러리 사용). 내 MWE 다음입니다 : 내가 Pugixml 라이브러리를 사용하여 XML 파일에서 변수 std::string strSystemName의 값을 읽고있다XML에서 독일어 텍스트 읽기 및 PDF로 쓰기

#include <iostream> 
#include "pugiconfig.hpp" 
#include "pugixml.hpp" 

using namespace pugi; 

int main() 
{ 
    pugi::xml_document doc; 
    pugi::xml_parse_result result = doc.load_file(FILEPATH); 

    xml_node root_node = doc.child("Report"); 
    xml_node SystemName_node = root_node.child("SystemName"); 

    std::string strSystemName = SystemName_node.child_value(); 

    std::cout<<" The name of the system is: "<<strSystemName<<std::endl; 

    return 0; 
} 

. 변수를 읽은 후 화면에 인쇄하고 있습니다 (실제 프로젝트에서는 pdf 파일에 쓰고 있습니다). 문제점 : 디버깅하는 동안 이상한 문자가 XML 파일 (이미 UTF-8)에서 읽혀진 것으로 나타났습니다. 화면에 변수를 인쇄하거나 pdf에 넣으면 나타납니다.

중요 : 콘솔에 인쇄하는 것은 그리 중요하지 않습니다. 중요한 것은 또한 UTF-8 인코딩을 사용하는 PDF 파일에 제대로 배치하는 것입니다. 그러나 나는 변수를 std::string에 저장하는 것이 어떻게 든 문제가되고 따라서 wrone 값이 PDF 작성자에게 전달된다고 생각합니다.

PS : 나는 VS2010에 C++ 11이없는 것을 사용하고 있습니다.

+0

매크로 'PUGIXML_WCHAR_MODE'을 변경하면 ... PugiXML 라이브러리를 다시 빌드해야합니까? – skm

+0

그렇게 생각합니다. 그러나 나는 그것이 도움이되지 않을지도 모른다라고 생각하고있다. 문제는'std :: string'을 사용하는 것이 아니라'std :: cout's'operator <<'를 직접 사용하는 것입니다. 'SystemName_node.print (std :: cout); 만 사용하면 어떻게됩니까? – StoryTeller

+0

만약 내가 그것을 사용하면 .. 여전히' ├älpha skm

답변

1

여기서 문제는 std::cout이 문자열의 UTF-8 바이트를 콘솔에 반영한다는 것입니다. 일반적으로 Windows에서는 콘솔이 UTF-8로 실행되지 않고 코드 페이지 1252에서 실행되므로 UTF-8의 두 바이트가 두 문자로 표시됩니다.

해결 방법은 콘솔을 UTF-8 (this 답변 참조)로 변환하거나 UTF-8 문자열을 CP-1252 문자열로 변환하는 것입니다. 나는이 MultiByteToWideChar을 요구하는 거라고 생각

이 (pugixml에 UTF-8 문자열을 전달하는) 당신의 실제 문제를 디버깅하려면 + WideCharToMultiByte (지정 CP-1252) (UTF-8을 지정), 당신은 실제 볼 필요가 문자열의 바이트 수를 확인하고 그들이 생각하는 바를 확인하십시오.

+0

화면의 인쇄가 중요하지 않다고 언급 한 '중요'섹션을 읽어보십시오. 중요한 것은 'std :: string'에 값을 올바르게 저장하여 PDF 작성자에게 올바르게 전달할 수 있도록하는 것입니다. – skm

+0

따라서 UTF8 인코딩 (예 :' "\ 0xC3 \ 0xA4")을 사용하여 문자열을 생성하고 PDF 생성 기능에 전달하고 다른 출력을 볼 수있는 * * [mvce]를 구성해야합니다. 을 원한다'). 그래도 작동하지 않는다면 PDF 함수의 문서를보고 그 함수를 작동시킬 수 있는지 확인해야합니다. 그렇지 않다면 다른 질문에 * 그 예를 게시 할 수 있습니다. –