※ ChatGPTを利用し、要約された質問です(原文:HTTPHeader情報の日本語が文字化けします)
HTTPHeader情報の日本語が文字化けします
このQ&Aのポイント
Mac OS X 10.6.7の開発環境で、HTTPHeader情報に日本語が含まれると文字化けしてしまいます。
HTTPレスポンスで返されるHeaderの情報には、正しいShift-JISのコードが含まれているにもかかわらず、取得した結果に不要なx00が補填されています。
現在のところ、この文字化け現象を回避するための解決策は見つかっていません。
開発環境
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にエンコーディングする事で、回避の
可能性もあると思っていますが、もしこの辺の情報をお持ちであれば
ご教示願います。
以上、何卒よろしくお願い致します。<(_@_)>
お礼
ご回答ありがとうございます! 上記のエンコーディングで試したところ、 特にバイト操作する事もなく、 正しいShift-Jis文字列が返されました。 結果として、正しく表示できました。 エンコーディングは、色々試していたつもりなのですが、 上記は、失念していたようです。失礼いたしました。 本当にありがとうございます。感謝にたえません。<(_@_)> 重ね重ね御礼申し上げます。