Как прочитать строку utf-8 из xml с использованием rapidxml?
Мой вопрос такой же, как этот вопрос без ответа?
Как читать значения Unicode XML с rapidxml
Но содержание моего XML кодируется в UTF-8. Я новичок в MS Visual Studio, C++.
Мой вопрос: как мы читаем строку UTF-8 в строку типа wchar_t?
Скажем, я определяю такую структуру,
typedef struct{
vector<int> stroke_labels;
int stroke_count;
wchar_t* uni_val;
}WORD_DETAIL;
и когда я читаю значение из XML я использую..
WORD_DETAIL this_detail;
this_detail.uni_val=curr_word->first_node("labelDesc")->first_node("annotationDetails")->first_node("codeSequence")->value();
Но хранимые строки utf-8 не соответствуют ожиданиям. Это испорченные персонажи.
Мои вопросы:
- Как я могу использовать rapidxml для чтения значений Unicode / Utf-8?
- Есть ли более простые парсеры xml, которые делают то же самое?
- Любой пример кода будет высоко оценен.
В разделе 2.1 здесь упоминается
"Обратите внимание, что RapidXml не выполняет декодирование - строки, возвращаемые функциями name () и value (), будут содержать текст, закодированный с использованием той же кодировки, что и исходный файл".
Если кодировка моего XML - UTF-8, каков наилучший способ получить возвращаемое значение функции ->value()?
Заранее спасибо.
1 ответ
Помните, что RapidXML - это синтаксический анализатор "in-situ": он анализирует XML и модифицирует содержимое, добавляя нулевые терминаторы в правильные места (и другие вещи).
Итак value()
Функция на самом деле просто возвращает указатель char * в ваши исходные данные. Если это UTF-8, то RapidXML возвращает указатель на строку символов UTF-8. Другими словами, вы уже делаете то, что просили в заголовке вопроса.
Но в размещенном вами фрагменте кода вы хотите сохранить wchar_t
в структуре. Во-первых, я рекомендую вам вообще этого не делать из-за проблем с владением памятью. Помните, вы должны использовать C++, а не C. И если вы действительно хотите хранить необработанный указатель, то почему бы не использовать UTF-8, который у вас уже есть? http://www.utf8everywhere.org/
Но, поскольку это окна, есть (удаленный) шанс, что вам нужно будет передать широкий массив символов в функцию API. Если это так, вам нужно будет преобразовать UTF-8 в широкие символы, используя функцию ОС MultiByteToWideChar
// Get the UTF-8
char *str = xml->first_node("codeSequence")->value();
// work out the size
int size = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
// allocate a vector for that size
std::vector<wchar_t> wide(size);
// do the conversion
MultiByteToWideChar(CP_UTF8, 0, str, -1, &wide[0], size);