我有一个XML(UTF-8)。我必须使用 PugiXML 库从中读取std::string
变量的值。读完该值后,我将其打印在控制台上,但在我的实际项目中,我必须将该值放入PDF(使用LibHaru库)。我的 MWE 如下:
#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。
重要提示:打印到控制台并不太重要。重要的是将它正确地放在PDF文件中,该文件也使用UTF-8编码。但我认为将变量存储在std::string
中会以某种方式产生问题,因此将wrone值传递给PDF编写器。
PS:我正在使用没有C ++ 11的 VS2010 。
答案 0 :(得分:1)
这里的问题是std::cout
只是将字符串中的UTF-8字节反映到控制台。通常在Windows上,控制台不是以UTF-8运行,而是在(例如)代码页1252中运行,因此UTF-8'ä`的两个字节显示为两个字符。
您的解决方案是将控制台转换为UTF-8(请参阅this answer),或将UTF-8字符串转换为CP-1252字符串。我认为这需要MultiByteToWideChar
(指定UTF-8)+ WideCharToMultiByte
(指定CP-1252)
要调试实际问题(将UTF-8字符串传递给pugixml),您需要查看字符串中的实际字节数,并检查它们是否符合您的想法。