Как прочитать строку 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 не соответствуют ожиданиям. Это испорченные персонажи.

Мои вопросы:

  1. Как я могу использовать rapidxml для чтения значений Unicode / Utf-8?
  2. Есть ли более простые парсеры xml, которые делают то же самое?
  3. Любой пример кода будет высоко оценен.

В разделе 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);
Другие вопросы по тегам