如何正确地将char*转换为std :: string?(使用expat/std :: string(char*)时出现问题)

Sma*_*tti 2 c++ string null-terminated expat-parser

问题描述

我正在使用Expat和自定义C++包装器,我已经在其他项目上测试过.我遇到了问题,因为原始数据(c_str)没有以正确的方式转换为std :: string.这让我印象深刻,因为我没有改变包装器的来源.

看起来这个字符串在转换后得到以null结尾的字符:

onCharacterData( std::string( pszData, nLength ) ) // --> std::string( char* pszData)
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

拥有expat包装器

// 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 ) );
}
Run Code Online (Sandbox Code Playgroud)

自定义解析器

// 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!

  // [...]
}
Run Code Online (Sandbox Code Playgroud)

expat包装器中的字符数据(char*)

expat包装器中的字符数据(char*)

解析器中的字符数据(std :: string)

解析器中的字符数据(std :: string)

Lig*_*ica 5

pszData似乎是某种特定于实现的Unicode派生格式,其中每个"字符"占用两个chars.

这意味着源数据被破坏; 它应该是一个wchar_t缓冲区.