Как правильно конвертировать char * в std :: string? (проблемы при использовании expat / std :: string (char *)) - PullRequest
2 голосов
/ 21 июля 2011

Описание проблемы

Я использую Expat с пользовательской оболочкой C ++, которую я уже тестировал в других проектах.Я сталкиваюсь с проблемами, потому что исходные данные (c_str) не преобразуются в std :: string правильным образом.Это меня беспокоит, потому что я не изменил источник обертки.

Похоже, что строка получает символы с нулевым символом в конце после этого преобразования:

onCharacterData( std::string( pszData, nLength ) ) // --> std::string( char* pszData)

Как я могу это исправить?

Собственная оболочка экспата

// Wrapper defines the class Expat and implements for example:
void XMLCALL Expat::CharacterDataHandler( void *pUserData, const XML_Char *pszData,
                                          int nLength )
{
  Expat* pThis = static_cast<Expat*>( pUserData );

  // XML_Char is char, therefore this call contains i.e.: std::string("hello", 5) 
  pThis->onCharacterData( std::string( pszData, nLength ) );
}

Пользовательский анализатор

// Parser is defined as: class Parser : Expat
void Parser::onCharacterData(const std::string& data )
{
  // data is no longer char*, but a std::string.
  // It seems to contain \0 after each character which is wrong!

  // [...]
}

Символьные данные в оболочке экспата (символ *)

Character data within the expat wrapper (char*)

Символьные данные в анализаторе (std :: string)

Character data within the parser (std::string)

Ответы [ 3 ]

5 голосов
/ 21 июля 2011

Ваш pszData представляется в каком-то специфическом для реализации формате Unicode, где каждый «символ» занимает два char с.

Это означает, что исходные данные повреждены;это должен был быть буфер wchar_t, возможно.

2 голосов
/ 21 июля 2011

Похоже, что экспат использует широкие символы и / или UTF-16. Попробуйте использовать std::wstring на обратном пути.

РЕДАКТИРОВАТЬ В документах я обнаружил, что он использует wchar_t, если определены макросы XML_UNICODE или XML_UNICODE_WCHAR_T.

0 голосов
/ 21 июля 2011

Как уже отмечали другие, кажется, pszData - это строка многобайтовых символов. Вы должны попробовать использовать std::basic_string<XML_Char> вместо std::string или std::wstring. Используйте typedef, если это кажется слишком многословным.

Конечно, если XML_Char не является ни char, ни wchar_t, вам может потребоваться указать специализацию шаблона для std::char_traits

РЕДАКТИРОВАТЬ:
Некоторый поиск в Google показал, что XML_Char - это UTF-8; библиотека может быть настроена на использование UTF-16, если вы определите XML_UNICODE или XML_UNICODE_WCHAR_T.

...