加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – UTF-8和TinyXML

发布时间:2020-12-16 07:05:09 所属栏目:百科 来源:网络整理
导读:由于某种原因,我无法正确读取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
由于某种原因,我无法正确读取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:UsersAdminDesktopTest.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:MailSendMailSend_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);

解决方法

我认为问题在于您的终端;你可以尝试在不同的终端上运行你的测试代码吗?一个已知良好的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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读