2016-12-14 53 views
0

我有一個XML(以UTF-8)。我必須從中讀取使用PugiXML庫一std::string變量的值。讀完值後,我將它打印在控制檯上,但在我的實際項目中,我必須將該值寫入PDF(使用LibHaru庫)。我MWE是以下幾點:閱讀從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; 
} 

我使用Pugixml庫一個XML文件中讀取的變量std::string strSystemName值。在閱讀變量後,我將它打印在屏幕上(在我的實際項目中,我將它寫入一個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''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(指定UTF-8)+ WideCharToMultiByte(指定CP-1252)

要調試實際問題(通過UTF-8字符串轉換爲pugixml),你需要看看實際字符串中的字節,並檢查它們是你認爲它們是什麼。

+0

請閱讀我所提到的「重要」部分,即在屏幕上打印並不重要。重要的是將值正確存儲在'std :: string'中,以便它們可以正確傳遞給PDF書寫器。 – skm

+0

因此,您需要構建另一個* [mvce],它顯示創建一個UTF8編碼的字符串(例如'「\ 0xC3 \ 0xA4」),將其傳遞給PDF創建函數,並查看您獲得的輸出想要一個')。如果這不起作用,您需要查看PDF功能的文檔並查看是否可以使其工作。如果不是,您可以在另一個問題中發佈*這個例子。 –

相關問題