c++ - UTF-8 和 TinyXML

标签 c++ encoding unicode tinyxml

出于某种原因,我无法从 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);

最佳答案

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

关于c++ - UTF-8 和 TinyXML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17676169/

相关文章:

c++ 跨方法锁定

c++ - 危险类型转换?

c++ - 为什么 while(int) 在 int = 0 时结束?

c++ - 模板类继承给出未知变量错误

java - 捆绑的 Java OS X 应用程序默认为 MacRoman 编码

unicode - 未知字符的字符代码,例如方形或问号罗布

c++ - 此 UTF-8 实现是实现定义的还是定义明确的?

c++ - 使用 boost 和标准 C++ 进行 Unicode 安全查找

encoding - 在YouTube上,由Expression Encoder编码的视频长3秒

c# - 在旧的 ascii postgresql 数据库中使用 npgsql entityFrameworkCore 的编码问题