[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[opensoap-users-ja:0058] Re: Encoding について



坂東@ISRCです。

kusunoki@tecinfosys.co.jp (楠夏生) write:
:坂東@ISRC様、早速のご指導ありがとうございます。
:
:>OpenSOAPEnvelope で、文字エンコードが確定するのは、
:>シリアライズされる時になっています。ですから、
:>OpenSOAPEnvelopeGetCharEncodingString の第二引数で指定するか、
:>あるいは、OpenSOAPTransportSetCharset の第二引数で指定すると
:>いいと思います。
:	上記での「シリアライズ」というのは、提供されるOpenSOAP_APIでそれぞれ
:	の型に抽出されるとき、という認識でよろしいでしょうか?
:	つまり、"Create系のAPI"や"Getxxx系のAPI"でOpenSOAPStringPtrや
:	OpenSOAPByteArrayPtrに格納された時点では、もうエンコーディングは済ん
:	でおり、その型に格納されているデータとしてのタグ上のエンコーディング
:	指定とは切り離されている....かな?

ここでのシリアライズというのは、OpenSOAPEnvelope → SOAP メッセージ(XML文章)
の変換のことでした。紛らわしくてすいません。
それで、encoding 属性自体は、XML文章になって始めて意味を持つものなので、
OpenSOAPEnvelope 自身には、そのような属性を持っていないため、
設定する事もできません。

:>上記の引数を NULL にしたり、OpenSOAPTransportSetCharset を
:>呼び出していなかったりすると、実行時の文字セットを使用するように
:>なっています。
:	なるほど、実行時の文字セットが初期値というわけですね。
:
:>参考になりましたでしょうか?
:	はい、とても参考になりました。
:
:ところで、ご指導いただいたOpenSOAPTransportSetCharset()ですが、この関数の
:実行タイミングについて???です。
:トランスポートの生成直後に実行してみたところ依然として<?xml>タグの
:エンコーディング属性は"EUC-JP"のままでした。

OpenSOAPTransportSetCharset() で設定した文字エンコーディングは、
通信経路上の XML 文章に適用されるものなので、
トンネルモニタ等を用いて通信経路上のデータを監視しなければ、
みる事はできません。
ここで、楠さんが "EUC-JP" のままとおっしゃっているのは、
いくつかのサンプルにある PrintEnvelope 関数をそのまま
つかっているためだと思います。ですので、この関数中の、
OpenSOAPEnvelopeGetCharEncodingString の第二引数を、
NULL から "UTF-8" に変更すれば、期待する動作が得られるのでは
ないかと思うのですが、いかがでしょうか?

:坂東@ISRC様の説明を、前述の「タグ上のエンコーディングとは切り離されている」
:と解釈したとき、実際に出力されるエンベロープは既にUTF-8になっていることにな
:ります。と、いうことは実装データのタグ属性を書き換えてあげる必要がある、と
:理解しましたが、実際にはどのようにすればよろしいのでしょうか?
:子エレメントや、ボディに対する属性の設定方法はサンプルで理解できたのですが、
:<?xml>に対するAttributeの設定方法を教えていただきたく思います。

SOAP の仕様では、XML 宣言(<?xml ?>の行)自体省略可能となっています。
つまり、SOAP では、XML 宣言は無くてもいいもののため、
OpenSOAP では、XML 宣言の属性を設定する機能は基本的に提供していません。
例外的に、encoding 属性は設定できますが、これも、XML文章化するときのみ
作用します。それは、encoding 属性を付加するのは、XML文章化するときにしか
意味をなさないからです。ですので、SOAP メッセージ(Envelope) に対して、
永続的に XML 宣言の encoding 属性を付加する方法はありませんし、
これからも提供されることはないのではないかと思います。
ただ、デフォルトのエンコーディングを設定する方法は、あったほうがいいの
かもしれません。

あと、UTF-8 な文字セットを持つ locale 例えば、ja_JP.UTF-8 が
ある場合、bash などの場合は、
LANG=ja_JP.UTF-8 ./HelloClient 
と実行すれば、UTF-8 の encoding 属性が付くはずです。

:重ね重ね、よろしくお願いいたします。