- PR -

C#でUTF8のstringをデコード

1
投稿者投稿内容
Joe
会議室デビュー日: 2004/04/22
投稿数: 3
投稿日時: 2004-05-24 15:27
C#でUTF8のstringをデコードする方法を教えてください。

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

以下のように実装してみようとしましたが。。。
コード:
  UTF8Encoding u8 = new UTF8Encoding();
  string title = u8.GetString(???);


???の部分はバイト配列を指定しなければならないようですが、UTF8の
stringをバイト配列に変換する方法がわかりませんでした。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-05-24 16:21
諸農です。

引用:

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



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

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Joe
会議室デビュー日: 2004/04/22
投稿数: 3
投稿日時: 2004-05-24 17:03
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()]



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

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

スキルアップ/キャリアアップ(JOB@IT)