2016-12-14 56 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功能的文档并查看是否可以使其工作。如果不是,您可以在另一个问题中发布*这个例子。 –

相关问题