QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

C#でUTF8のstringをデコード

C#でUTF8のstringをデコードする方法を教えてください。

VS.NET+C#でAmazon Webサービスを利用するサンプルアプリケーションを
作成しています。で、書籍情報を検索して得られた値を表示したら日本語
の部分は????に文字化けしてしまいます。調べたところ、UTF8で値が帰っ
てくるようなのですが、その文字列をデコードする方法がわかりません。

以下のように実装してみようとしましたが。。。



  UTF8Encoding u8 = new UTF8Encoding();
  string title = u8.GetString(???);

???の部分はバイト配列を指定しなければならないようですが、UTF8の
stringをバイト配列に変換する方法がわかりませんでした。

質問者:Joe

回答

諸農です。

???の部分はバイト配列を指定しなければならないようですが、UTF8の

stringをバイト配列に変換する方法がわかりませんでした。

ちゃんと見ていませんが(^^;)
EncodingクラスにGetBytes()メソッドって言うのが無かったでしたっけ??
_
_______________諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/

投稿者:Jubei

編集 履歴 (0)

Jubeiさん、こんにちは。
レスありがとうございます。UTF8EncodingにGetBytesメソッドがあったので
すね。



string title = u8.GetString(u8.GetBytes(utf8string));

のように変更してみましたが、日本語が正しく表示されませんでした。
で、色々Webを検索してみたところ、
C#でAmazon.co.jpのWebサービスに接続すると日本語が文字化けするという現象
があり、SOAPフォーマッタのContent-Typeを書きかえてやれば良いそうです。
手順は以下のとおりです。

以下コードをWeb参照より生成されたコードの最後に追加してやる。



public class ContentTypeExtension : SoapExtension
{
    string filename;
    string contentType = @"text/xml; charset=utf-8";
    public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
    {
        return ((ContentTypeExtensionAttribute) attribute).ContentType;
    }
    public override object GetInitializer(Type WebServiceType)
    {
        return WebServiceType.GetType().ToString();
    }
    public override void Initialize(object initializer)
    {
        filename = (string) initializer;
    }
    public override void ProcessMessage(SoapMessage message)
    {
        switch (message.Stage)
        {
            case SoapMessageStage.BeforeSerialize:
                break;
            case SoapMessageStage.AfterSerialize:
                break;
            case SoapMessageStage.BeforeDeserialize:
                message.ContentType = contentType;
                break;
            case SoapMessageStage.AfterDeserialize:
                break;
            default:
                throw new Exception("invalid stage");
        }
    }
}
[AttributeUsage(AttributeTargets.Method)]
public class ContentTypeExtensionAttribute : SoapExtensionAttribute
{
    private string content_type;
    private int priority;
    public override Type ExtensionType
    {
        get { return typeof(ContentTypeExtension); }
    }
    public override int Priority
    {
        get { return priority; }
        set { priority = value; }
    }
    public string ContentType
    {
        get { return content_type; }
        set { content_type = value; }
    }
}

使用するメソッドに以下のように属性を追加する。



[ContentTypeExtension()]

です。で、正常に日本語が表示されるようになりました。

ありがとうございました。

投稿者:Joe

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。