Как читать значения Unicode XML с помощью rapidxml

RapidXML — одна из доступных библиотек для разбора XML в C++. Для получения значений мы можем использовать что-то вроде:

node->first_node("xmlnode")->value()

Эта команда возвращает тип данных char*. Есть ли способ прочитать значение как Unicode, чтобы я мог назначить его в переменной WCHAR или wstring?


person Ali    schedule 29.08.2013    source источник
comment
Вы нашли ответ? Я застрял в той же проблеме.   -  person Koustav Ghosal    schedule 01.10.2013


Ответы (3)


Из руководства

RapidXml не зависит от типа символов и может работать как с узкими, так и с широкими символами. Текущая версия не полностью поддерживает кодировку UTF-16 или UTF-32, поэтому использование расширенных символов несколько неработоспособно. Однако он должен успешно анализировать строки wchar_t, содержащие UTF-16 или UTF-32, если порядок байтов данных совпадает с порядком байтов машины.

поэтому я просто использую следующее:

#include <rapidxml/rapidxml.hpp>
typedef rapidxml::xml_node<wchar_t> const *      xml_node_cptr;
typedef rapidxml::xml_node<wchar_t> *            xml_node_ptr;
typedef rapidxml::xml_attribute<wchar_t> const * xml_attribute_cptr;
typedef rapidxml::xml_attribute<wchar_t> *       xml_attribute_ptr;
typedef rapidxml::xml_document<wchar_t>          xml_doc;

Обратите внимание, что если вы сделаете это, все параметры будут wchar_t, поэтому вызов first_node() также должен быть wchar_t. то есть

node->first_node(L"xmlnode")->value()
person dteviot    schedule 04.10.2013

здесь вам нужно преобразовать str в wstr. вы можете использовать для этого стандарта std

#include <string>
#include <codecvt>
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;

std::string strSample; // convert str to wstr
std::wstring wstrValue = converter.from_bytes(strSample);

std::wstring wstrSample; // convert wstr to str
std::string strValue = converter.to_bytes(wstrSample);

надеюсь, что это поможет

person Alexander I. Denisevich    schedule 06.12.2017

Другим решением является использование функций, приведенных в: http://msmvps.com/blogs/gdicanio/archive/2010/01/04/conversion-between-unicode-utf-16-and-utf-8-in-c-win32.aspx

CStringW ConvertUTF8ToUTF16( __in const CHAR * pszTextUTF8 )
{
    //
    // Special case of NULL or empty input string
    //
    if ( (pszTextUTF8 == NULL) || (*pszTextUTF8 == '\0') )
    {
        // Return empty string
        return L"";
    }


    //
    // Consider CHAR's count corresponding to total input string length,
    // including end-of-string (\0) character
    //
    const size_t cchUTF8Max = INT_MAX - 1;
    size_t cchUTF8;
    HRESULT hr = ::StringCchLengthA( pszTextUTF8, cchUTF8Max, &cchUTF8 );
    if ( FAILED( hr ) )
    {
        AtlThrow( hr );
    }

    // Consider also terminating \0
    ++cchUTF8;

    // Convert to 'int' for use with MultiByteToWideChar API
    int cbUTF8 = static_cast<int>( cchUTF8 );


    //
    // Get size of destination UTF-16 buffer, in WCHAR's
    //
    int cchUTF16 = ::MultiByteToWideChar(
        CP_UTF8,                // convert from UTF-8
        MB_ERR_INVALID_CHARS,   // error on invalid chars
        pszTextUTF8,            // source UTF-8 string
        cbUTF8,                 // total length of source UTF-8 string,
                                // in CHAR's (= bytes), including end-of-string \0
        NULL,                   // unused - no conversion done in this step
        0                       // request size of destination buffer, in WCHAR's
        );
    ATLASSERT( cchUTF16 != 0 );
    if ( cchUTF16 == 0 )
    {
        AtlThrowLastWin32();
    }


    //
    // Allocate destination buffer to store UTF-16 string
    //
    CStringW strUTF16;
    WCHAR * pszUTF16 = strUTF16.GetBuffer( cchUTF16 );

    //
    // Do the conversion from UTF-8 to UTF-16
    //
    int result = ::MultiByteToWideChar(
        CP_UTF8,                // convert from UTF-8
        MB_ERR_INVALID_CHARS,   // error on invalid chars
        pszTextUTF8,            // source UTF-8 string
        cbUTF8,                 // total length of source UTF-8 string,
                                // in CHAR's (= bytes), including end-of-string \0
        pszUTF16,               // destination buffer
        cchUTF16                // size of destination buffer, in WCHAR's
        );
    ATLASSERT( result != 0 );
    if ( result == 0 )
    {
        AtlThrowLastWin32();
    }

    // Release internal CString buffer
    strUTF16.ReleaseBuffer();

    // Return resulting UTF16 string
    return strUTF16;
}
person Ali    schedule 22.01.2014