4

何らかの理由で、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;

}

次のようにメインメソッドで呼び出します。

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

1 に答える 1

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>
于 2013-07-16T19:36:00.877 に答える