2

問題の説明

Expat をカスタム C++ ラッパーと共に使用していますが、これは他のプロジェクトで既にテスト済みです。元のデータ (c_str) が正しい方法で std::string に変換されていないため、問題が発生しています。ラッパーのソースを変更していないので、これは気になります。

この変換後、文字列が null で終わる文字を取得するようです。

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派生形式であるように見えます。ここで、各「文字」は2char秒を占めます。

これは、ソースデータが壊れていることを意味します。wchar_tおそらくバッファだったはずです。

于 2011-07-21T12:54:14.500 に答える
2

駐在員がワイド文字やUTF-16を使用しているようです。std::wstring帰りに使ってみてください。

編集ドキュメントで、マクロが定義されている場合に使用していることがわかりましたwchar_tXML_UNICODEXML_UNICODE_WCHAR_T

于 2011-07-21T12:55:22.657 に答える
0

他の人が指摘しているようpszDataに、マルチバイト文字列のようです。またはstd::basic_string<XML_Char>の代わりに使用してみてください。冗長すぎると思われる場合は、 a を使用してください。std::stringstd::wstringtypedef

もちろん、XML_Charが acharでも a でもない場合はwchar_t、テンプレートの特殊化を提供する必要があるかもしれませんstd::char_traits

編集:
いくつかのグーグルは、XML_Char が UTF-8 であることを明らかにしました。XML_UNICODEまたはを定義すると、ライブラリで UTF-16 を使用するようにできますXML_UNICODE_WCHAR_T

于 2011-07-21T13:14:57.793 に答える