UTF-8 и TinyXML

Почему-то я не могу читать данные из XML-файла должным образом.
Например, вместо «Шредер» я получаю что-то вроде «Шредер».

Мой код:

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 (имя файла, 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:[email protected] -t:[email protected] -s:Subject -b:Body " + test);

4

Решение

Я думаю, что проблема с вашим терминалом; Вы можете попробовать запустить свой тестовый код в другом терминале? один с известной хорошей поддержкой 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>
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]