Как конвертировать CString в unsigned char * с Unicode? - PullRequest
1 голос
/ 28 января 2009

Я пытаюсь сделать что-то простое здесь. Когда я выполняю следующий код в Visual Studio 2008, используя набор символов Unicode, xmlString является правильным.

К сожалению, мне нужно конвертировать CString в неподписанный символ *. Используя приведенный ниже код, ucStr становится «<» (т. Е. Первым символом xmlString). </p>

Как мне преобразовать CString в беззнаковый символ * и сохранить всю информацию?

        CString xmlString;
        xmlString.Format( _T("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><gateway><config-read><%s /></config-read></gateway>"), keyName);

        unsigned char * ucStr = reinterpret_cast<unsigned char *> (xmlString.GetBuffer());
        pgIRequest->SendXmlData( "dgv/gateway.xml", ucStr, xmlString.GetLength() + 1) ; 

Ответы [ 5 ]

3 голосов
/ 29 января 2009

Этот фрагмент кода может не работать, когда ваша переменная 'keyName' начинает содержать символы, которые не представлены в кодировке ISO-8859-1. Для этого я рекомендую создать строку с UTF-8 в качестве значения кодирования, преобразовать в поток байтов UTF-8, используя WideCharToMultiByte, используя кодовую страницу CP_UTF8, и отправить полученный поток байтов utf8.

3 голосов
/ 29 января 2009

Я считаю, что самым простым является использование конструктора CStringA, например:

    CString xmlString;
    xmlString.Format( _T("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><gateway><config-read><%s /></config-read></gateway>"), "test");

    printf("%s\n",xmlString );  // fails "<"

    //unsigned char * ucStr = reinterpret_cast<unsigned char *> (xmlString.GetBuffer());

    CStringA ucStr( xmlString );

    printf("%s\n",ucStr );   // works!
1 голос
/ 29 января 2009

Я думаю, вы хотите wcstombs , или, скорее, его более безопасный аналог wcstombs_s .

0 голосов
/ 29 января 2009

Вот код, который наконец заработал:

CString xmlString;
        xmlString.Format( _T("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><gateway><config-read><%s /></config-read></gateway>"), keyName);
        CStringA ucStr( xmlString );
        unsigned char * ucStr2 = reinterpret_cast<unsigned char *> (ucStr.GetBuffer());
        pgIRequest->SendXmlData( "dgv/gateway.xml", ucStr2, xmlString.GetLength() + 1) ;// target on gateway to download
0 голосов
/ 29 января 2009

Я предполагаю, что «SendXmlData» хочет количество байтов, а не количество символов.

Если это так, вы хотите изменить "GetLength () + 1" на "(GetLength () + 1) * sizeof (xmlString [0])".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...