FRu*_*les 5 c++ unicode encoding tinyxml
由于某种原因,我无法正确从 xml 文件读取数据。\n例如,我得到的不是“Schr\xc3\xbcder”,而是类似“Schr\xc3\x83\xc2\xbcder”的内容。
\n\n我的代码:
\n\ntinyxml2::XMLDocument doc;\n\nbool open(string path) {\n if(doc.LoadFile(path.c_str()) == XML_SUCCESS)\n return true;\n return false;\n}\n\n\n\nint main() {\n if(open("C:\\\\Users\\\\Admin\\\\Desktop\\\\Test.xml"))\n cout << "Success" << endl;\n\n XMLNode * node = doc.RootElement();\n string test = node->FirstChild()->GetText();\n\n cout << test << endl;\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n\nXML 的一部分:
\n\n<?xml version="1.0" encoding="UTF-8"?>\n<myXML>\n <my:TXT_UTF8Test>Schr\xc3\xbcder</my:TXT_UTF8Test>\n</myXML>\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,如果我将其转换为 ANSI 并将编码类型更改为“ISO-8859-15”,则它可以正常工作。
\n\n我读到类似“LoadFile( filename, TIXML_ENCODING_UTF8 )”之类的内容应该有帮助。然而事实并非如此(错误:无效参数,它只需要一个 const char)。我有最新版本的 TinyXML2(我猜?)。我几分钟前从https://github.com/leethomason/tinyxml2下载了它下载了它。
\n\n有任何想法吗?
\n\n编辑:当我将字符串写入 .xml 或 .txt 文件时,它工作正常。eclipse ide 控制台可能存在一些问题。无论如何,当我尝试通过电子邮件发送字符串时,我也遇到了同样的问题。这是邮件发送脚本:
\n\nbool sendMail(std::string params) {\n\n if( (int) ShellExecute(NULL, "open", "H:\\\\MailSend\\\\MailSend_anhang.exe", params.c_str(), NULL, SW_HIDE) <= 32 )\n return false;\n return true;\nRun Code Online (Sandbox Code Playgroud)\n\n}
\n\n我在 main 方法中这样调用它:
\n\nsendMail("-f:d.nitschmann@example.com -t:person2@example.com -s:Subject -b:Body " + test);\nRun Code Online (Sandbox Code Playgroud)\n
我认为问题出在你的终端上;您可以尝试在不同的终端中运行测试代码吗?一个已知良好的 UTF-8 支持?
\n\n终端以 UTF-8 模式输出:
\n\n$ ./a.out \nSuccess\nSchr\xc3\xbcder\nRun Code Online (Sandbox Code Playgroud)\n\nISO-8859-15 模式下终端输出:
\n\n$ ./a.out \nSuccess\nSchr\xc3\x83\xc5\x92der\nRun Code Online (Sandbox Code Playgroud)\n\n另外 - 请尝试关注http://sscce.org/ - 为了后代,这里是您的代码,其中包含编译所需的所有内容(17676169.cpp):
\n\n#include <tinyxml2.h>\n#include <string>\n#include <iostream>\n\nusing namespace std;\nusing namespace tinyxml2;\n\ntinyxml2::XMLDocument doc;\n\nbool open(string path) {\n if(doc.LoadFile(path.c_str()) == XML_SUCCESS)\n return true;\n return false;\n}\n\n\n\nint main() {\n if(open("Test.xml"))\n cout << "Success" << endl;\n\n XMLNode * node = doc.RootElement();\n string test = node->FirstChildElement()->GetText();\n\n cout << test << endl;\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n编译为:
\n\ng++ -o 17676169 17676169.cpp -ltinyxml2\nRun Code Online (Sandbox Code Playgroud)\n\n和 uuencoded Test.xml - 确保使用完全相同的数据
\n\nbegin 660 Test.xml\nM/#]X;6P@=F5R<VEO;CTB,2XP(B!E;F-O9&EN9STB551&+3@B/SX*/&UY6$U,\nM/@H@("`@/&UY.E185%]55$8X5&5S=#Y38VARP[QD97(\\+VUY.E185%]55$8X\n/5&5S=#X*/"]M>5A-3#X*\n`\nend\nRun Code Online (Sandbox Code Playgroud)\n\n编辑1:
\n\n如果你想证实这个理论 - 在 eclipse 中运行:
\n\n#include <iostream>\n#include <string>\n#include <fstream>\n\nint main()\n{\n std::ifstream ifs("Test.xml");\n std::string xml_data((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());\n std::cout << xml_data;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n终端以 UTF-8 模式输出:
\n\n$ ./17676169.cat \n<?xml version="1.0" encoding="UTF-8"?>\n<myXML>\n <my:TXT_UTF8Test>Schr\xc3\xbcder</my:TXT_UTF8Test>\n</myXML>\nRun Code Online (Sandbox Code Playgroud)\n\nISO-8859-15 模式下终端输出:
\n\n$ ./17676169.cat \n<?xml version="1.0" encoding="UTF-8"?>\n<myXML>\n <my:TXT_UTF8Test>Schr\xc3\x83\xc5\x92der</my:TXT_UTF8Test>\n</myXML>\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
6589 次 |
| 最近记录: |