【问题标题】:UTF-8 and TinyXMLUTF-8 和 TinyXML
【发布时间】:2013-07-16 12:09:51
【问题描述】:

由于某种原因,我无法正确地从 xml 文件中读取数据。 例如,我得到的不是“Schrüder”,而是“Schrüder”。

我的代码:

tinyxml2::XMLDocument doc;

bool open(string path) {
    if(doc.LoadFile(path.c_str()) == XML_SUCCESS)
        return true;
    return false;
}



int main() {
    if(open("C:\\Users\\Admin\\Desktop\\Test.xml"))
    cout << "Success" << endl;

    XMLNode * node = doc.RootElement();
    string test = node->FirstChild()->GetText();

    cout << test << endl;
    return 0;
}

部分 XML:

<?xml version="1.0" encoding="UTF-8"?>
<myXML>
    <my:TXT_UTF8Test>Schrüder</my:TXT_UTF8Test>
</myXML>

请注意,如果我将其转换为 ANSI 并将编码类型更改为“ISO-8859-15”,它可以正常工作。

我读到“LoadFile(filename, TIXML_ENCODING_UTF8)”之类的内容应该会有所帮助。然而事实并非如此(错误:无效的参数,它只需要一个 const char)。我有最新版本的 TinyXML2(我猜?)。我几分钟前从https://github.com/leethomason/tinyxml2下载了它。

有什么想法吗?

编辑:当我将字符串写入 .xml 或 .txt 文件时,它可以正常工作。 eclipse ide 控制台可能存在一些问题。无论如何,当我尝试通过电子邮件发送字符串时,我也会遇到同样的问题。这是 MailSend 脚本:

bool sendMail(std::string params) {

    if( (int) ShellExecute(NULL, "open", "H:\\MailSend\\MailSend_anhang.exe", params.c_str(), NULL, SW_HIDE) <= 32 )
        return false;
    return true;

}

我在 main 方法中这样调用它:

sendMail("-f:d.nitschmann@example.com -t:person2@example.com -s:Subject -b:Body " + test);

【问题讨论】:

  • 虽然它没有回答你的问题,pugixml 声称他们有很好的 Unicode 支持。
  • TinyXML 也声称自然支持 UTF-8;你确定你正在加载的文件是 UTF-8 编码的吗?
  • 是的,绝对是。
  • UTF-8 编码是否正确?有BOM吗? (二进制文件的第一个原始字节是什么)
  • 好吧,我不太清楚你所说的“正确”是什么意思。我用记事本++打开了XML文件,然后单击“编码->没有BOM的UTF8”和“编码->转换为没有BOM的UTF-8”。你能告诉我在哪里可以看到第一个原始字节吗?我需要专门的编辑器吗?

标签: c++ encoding unicode tinyxml


【解决方案1】:

我认为问题出在您的终端上;您可以尝试在不同的终端中运行您的测试代码吗?一个已知良好的 UTF-8 支持?

在 UTF-8 模式下使用终端输出:

$ ./a.out 
Success
Schrüder

在 ISO-8859-15 模式下使用终端输出:

$ ./a.out 
Success
SchrÃŒder

另外 - 请尝试关注http://sscce.org/ - 为了后代,这里是您的代码,包含编译所需的一切 (17676169.cpp):

#include <tinyxml2.h>
#include <string>
#include <iostream>

using namespace std;
using namespace tinyxml2;

tinyxml2::XMLDocument doc;

bool open(string path) {
    if(doc.LoadFile(path.c_str()) == XML_SUCCESS)
        return true;
    return false;
}



int main() {
    if(open("Test.xml"))
    cout << "Success" << endl;

    XMLNode * node = doc.RootElement();
    string test = node->FirstChildElement()->GetText();

    cout << test << endl;
    return 0;
}

编译:

g++ -o 17676169 17676169.cpp -ltinyxml2

和 uuencoded Test.xml - 确保使用完全相同的数据

begin 660 Test.xml
M/#]X;6P@=F5R<VEO;CTB,2XP(B!E;F-O9&EN9STB551&+3@B/SX*/&UY6$U,
M/@H@("`@/&UY.E185%]55$8X5&5S=#Y38VARP[QD97(\+VUY.E185%]55$8X
/5&5S=#X*/"]M>5A-3#X*
`
end

编辑 1:

如果你想证实这个理论 - 在 eclipse 中运行它:

#include <iostream>
#include <string>
#include <fstream>

int main()
{
    std::ifstream ifs("Test.xml");
    std::string xml_data((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
    std::cout << xml_data;
}

在 UTF-8 模式下使用终端输出:

$ ./17676169.cat 
<?xml version="1.0" encoding="UTF-8"?>
<myXML>
    <my:TXT_UTF8Test>Schrüder</my:TXT_UTF8Test>
</myXML>

在 ISO-8859-15 模式下使用终端输出:

$ ./17676169.cat 
<?xml version="1.0" encoding="UTF-8"?>
<myXML>
    <my:TXT_UTF8Test>SchrÃŒder</my:TXT_UTF8Test>
</myXML>

【讨论】:

  • 感谢您的回答。我用另一个终端试了一下——完美无瑕。不幸的是,它在电子邮件中不起作用。
  • 您能否详细说明电子邮件是如何发送的?
  • 是的。 MailSend.exe 需要 1 个包含 4 个值的字符串:From (-f:)、To(-t:)、Subject(-s:) 和 Body (-b:)。如果我直接在正文中写“Schrüder”之类的东西,它就会起作用。但是,如果我从 xml 文件中插入带有数据的字符串,它就不起作用了(参见上面的 main 方法)。
  • 您能否详细说明您最终是如何正确发送邮件的?即您是否从终端运行 MailSend.exe 然后将文本复制到终端中 - 或者它是否也通过 ShellExecute 调用?如果它在一个终端中,使用什么编码?您的程序的输出是否正确显示在此终端中?如上所述,string test 确实包含 UTF-8 - 我最好的猜测是 MailSend.exe 假定终端的字符编码 - 你可以尝试将字符集明确指定为 MailSend.exe 吗?
  • 另外 - 邮件从哪里发送,我在哪里可以找到它的文档?好像不是this
猜你喜欢
  • 2010-09-13
  • 2020-12-09
  • 2017-05-07
  • 1970-01-01
  • 2011-10-11
  • 2017-05-19
  • 2015-12-03
  • 2014-12-31
  • 1970-01-01
相关资源
最近更新 更多