こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

HTTPHeader情報の日本語が文字化けします

開発環境
Mac OS X 10.6.7
xCode バージョン 3.2.6 (1761)
ターゲット:iOS4.3 (iPhone)

当方、開発歴(アセンブラ,C,C++,VB,.Net等)は長いですが、Cocoa系は初心者です。
iPhone上で動作するネットラジオストリーミングアプリを作成しています。

ストリーミングの実装はうまくいったのですが、
HTTPレスポンスで返される、Headerの情報に日本語が
使われている場合、文字化けを起こしてしまい、うまく表示できません。

●ソースコード
// (1) サーバーへのリクエストの作成
NSMutableURLRequest *req;
req = [NSMutableURLRequest requestWithURL:url];

[req addValue:@"1" forHTTPHeaderField:@"Icy-MetaData"];

// (2) サーバーへ接続
NSURLConnection *con = [NSURLConnection connectionWithRequest : req
delegate : self];


- (void) connection : (NSURLConnection *) connection
didReceiveResponse : (NSURLResponse *) response {

// (3) HTTPのヘッダー全体を辞書として取得
NSDictionary *dic = [(NSHTTPURLResponse *)response allHeaderFields];
//Icy-Nameの取得
radioTitleLabel.text = [dic objectForKey:@"Icy-Name"]; //ここで文字化けしています
}

●現象
文字コードは、「Shift-Jis」で返って来ていますが、
何故か、NSDictionaryに格納されたデータを取り出すと、
文字コードの間に、x00 が、挿入されています。

例)ひらがなの「と」

パケットキャプチャ上で見た場合、
x 82C6 と正しいShift-Jisのコードが
返されています。

[dic objectForKey:@"Icy-Name"]; で取得した結果を、
メモリブラウザで確認した場合、
x82x00xC6x00と、x00が補填されて返されてしまいます。

●試した事
・私の検索方法がまずいのかもしれませんが、同様の現象を
扱っているネット上のコンテンツを見つける事はできませんでした。

・パケットキャプチャは、CocoaPacketAnalyzerを使用して、
パケットの内容を確認しています。

・NSDataなどを利用して、バイト単位で解析を行い、不要な x00 を
取り除く処理も考えましたが、エンコーディングの段階で、思ったような
バイト列を取得できず、現時点ではうまくいっていません。
そもそも、バイト単位での解析が必要なのかは、疑問なところです。

●推測
・パケットキャプチャを信じるならば、response allHeaderFields を
使用した段階で、何らかの補填がされているのではと推測しています。
サーバアプリ(IceCast 2.3.1)は、正しいShift-Jisコードを返していると判断しています。

・補足ですが、iTunes10.2でも同じネットラジオ局の
ストリーミングを聴取すると、曲名、ラジオタイトルなど全く同様の文字化けを起こします。

●要望
・目的は、ラジオタイトル、曲名、アーティスト名を、正しく日本語表示
したいということです。上記の現象を踏まえ、
的確な回避策、もしくは同様の現象を回避された方があれば、ご教示願います。

・回避策として、x00 が補填された文字列を、バイト単位で処理して、
不要な x00 を削除後に、Shift-Jisにエンコーディングする事で、回避の
可能性もあると思っていますが、もしこの辺の情報をお持ちであれば
ご教示願います。

以上、何卒よろしくお願い致します。<(_@_)>

投稿日時 - 2011-05-05 10:06:53

QNo.6715211

すぐに回答ほしいです

質問者が選んだベストアンサー

こっちを試してみるとか:

NSData* sjisData = [str dataUsingEncoding:NSISOLatin1StringEncoding allowLossyConversion:YES];

投稿日時 - 2011-05-05 23:09:12

お礼

ご回答ありがとうございます!

上記のエンコーディングで試したところ、
特にバイト操作する事もなく、
正しいShift-Jis文字列が返されました。
結果として、正しく表示できました。

エンコーディングは、色々試していたつもりなのですが、
上記は、失念していたようです。失礼いたしました。

本当にありがとうございます。感謝にたえません。<(_@_)>
重ね重ね御礼申し上げます。

投稿日時 - 2011-05-06 09:09:23

ANo.3

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

http://www.google.com/search?hl=ja&q=%22didReceiveResponse%22

NSDictionary に渡してるみたいだけどちょっと見てみると NSData(mutableだとおもうけど)で受け取ってる物も見受けられるけどやってみた?

投稿日時 - 2011-05-05 11:46:02

お礼

度々ありがとうございます。<(_@_)>

同期通信だと、NSDataでも受取れるようですね。。。

ただ、今回の場合、非同期で行う必要があり、かつ以下のコードにおいて、

NSDictionary *dic = [(NSHTTPURLResponse *)response allHeaderFields];

allHeaderFields というメソッドの戻り値の型が、NSDictionary* であり、

その型でしか受取れないというのが、現状です。。。

投稿日時 - 2011-05-05 12:03:16

ANo.1

http://www.google.com/search?hl=ja&q=%22nsdata%22%20shift_jis%20%E5%A4%89%E6%8F%9B

どうやら NSString の dataUsingEncoding ってので変換が要るみたい

投稿日時 - 2011-05-05 10:20:01

お礼

早速のご回答ありがとうございます。

ご教示頂いたページを参考に試してみましたが、
やはり正しいと思われるバイト列が返ってきません。

1:NSString* str = [dic objectForKey:@"Icy-Name"];
2:NSData* sjisData = [str dataUsingEncoding:NSShiftJISStringEncoding allowLossyConversion:YES];

1の段階の str に、既に x00 が補填されたShift-Jis文字列が返されているため、
sjisData には、解析不能なバイト列が返されます。(T^T)

投稿日時 - 2011-05-05 11:01:51

あなたにオススメの質問