5

一部の HTTPS 通信を行い、XML サーバーの応答を提供する外部 C++ ライブラリを使用しています。サーバー側では、応答は経由でエンコードされ、API からその応答を表すISO-8859-15を取得します。std::string印刷/ファイルに書き込むと、適切に見えます。

std::stringとエラー コードを外部のint呼び出し元に渡す必要があります。したがって、構造体内で両方の値を返します。

extern "C" {
  struct FoobarResponse {
    const char* responseText;
    int returnCode;
  };
}

残念ながら、以前の助けを借りて、std::string応答をconst char*C スタイルの文字列表現に変換する必要がありstd::c_str()ます。理由: 私の呼び出し元は、私の C++ ライブラリと通信するために Ruby FFI を使用する Ruby スクリプトであり、ここでの言語間型変換は Ruby::string -> C::const char* です。

ここで興味深いstd::coutのは、構造体に入れた後に変換された文字列であれば、まだ問題ありません。

問題: Ruby 側でサーバーの応答を処理すると、壊れます。次のような元の答えの代わりに:

<?xml version="1.0" encoding="ISO-8859-15"?>
<Foobar xmlns="http://www.foobar.com/2012/XMLSchema">
  ...
</Foobar>

明らかに印刷できない文字を含む文字列を受け取りましたが、これは常に最初と最後で壊れています。

?O[
l version="1.0" encoding="ISO-8859-15"?>
<Foobar xmlns="http://www.foobar.com/2012/XMLSchema">
</Fo??

実際、文字列には、改行、キャリッジ リターン、およびタブが少なくとも、おそらくそれ以上含まれています。

:force_encodingRuby 側の文字列をASCII-8BIT, ISO-8859-15and UTF-8, に変更してみました。文字列を構造体に入れる前に C++ 側で base64 エンコードを試み、このコードを使用して Ruby 側で base64 デコードを試みましたが、変更はありません。

Iconv同様に文字列を変換しようと何度も試みましたが、変更はありませんでした。

また、文字列を構造体に入れる前に、印刷できない文字を文字列から削除しようとしましたが、失敗しました。

ここで何が起こっているのか、オプションが不足しているのかわかりません。誰かが私を正しい方向に向けることができますか?

よろしくフェリックス

4

1 に答える 1