一部の 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_encoding
Ruby 側の文字列をASCII-8BIT
, ISO-8859-15
and UTF-8
, に変更してみました。文字列を構造体に入れる前に C++ 側で base64 エンコードを試み、このコードを使用して Ruby 側で base64 デコードを試みましたが、変更はありません。
Iconv
同様に文字列を変換しようと何度も試みましたが、変更はありませんでした。
また、文字列を構造体に入れる前に、印刷できない文字を文字列から削除しようとしましたが、失敗しました。
ここで何が起こっているのか、オプションが不足しているのかわかりません。誰かが私を正しい方向に向けることができますか?
よろしくフェリックス