2

问题描述

我正在将 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!

  // [...]
}

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

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

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

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

4

3 回答 3

5

pszData似乎采用某种特定于实现的 Unicode 派生格式,其中每个“字符”占用两个chars。

这意味着源数据已损坏;也许它应该是一个wchar_t缓冲区。

于 2011-07-21T12:54:14.500 回答
2

看起来外籍人士正在使用宽字符和/或 UTF-16。尝试std::wstring在回来的路上使用。

编辑我在文档中发现它正在使用wchar_tifXML_UNICODEXML_UNICODE_WCHAR_T宏被定义。

于 2011-07-21T12:55:22.657 回答
0

正如其他人指出的那样,它似乎pszData是一个多字节字符串。您应该尝试使用std::basic_string<XML_Char>代替std::stringor std::wstringtypedef如果这看起来太冗长,请使用。

当然,如果XML_Char既不是 achar也不是 awchar_t您可能必须为std::char_traits

编辑:
一些谷歌搜索显示 XML_Char 是 UTF-8;XML_UNICODE如果您定义或,则可以使该库使用 UTF-16 XML_UNICODE_WCHAR_T

于 2011-07-21T13:14:57.793 回答