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

このQ&Aのポイント
  • Mac OS X 10.6.7の開発環境で、HTTPHeader情報に日本語が含まれると文字化けしてしまいます。
  • HTTPレスポンスで返されるHeaderの情報には、正しいShift-JISのコードが含まれているにもかかわらず、取得した結果に不要なx00が補填されています。
  • 現在のところ、この文字化け現象を回避するための解決策は見つかっていません。
回答を見る
  • ベストアンサー

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にエンコーディングする事で、回避の 可能性もあると思っていますが、もしこの辺の情報をお持ちであれば ご教示願います。 以上、何卒よろしくお願い致します。<(_@_)>

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

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.3

こっちを試してみるとか: NSData* sjisData = [str dataUsingEncoding:NSISOLatin1StringEncoding allowLossyConversion:YES];

tommwo
質問者

お礼

ご回答ありがとうございます! 上記のエンコーディングで試したところ、 特にバイト操作する事もなく、 正しいShift-Jis文字列が返されました。 結果として、正しく表示できました。 エンコーディングは、色々試していたつもりなのですが、 上記は、失念していたようです。失礼いたしました。 本当にありがとうございます。感謝にたえません。<(_@_)> 重ね重ね御礼申し上げます。

その他の回答 (2)

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.2

http://www.google.com/search?hl=ja&q=%22didReceiveResponse%22 NSDictionary に渡してるみたいだけどちょっと見てみると NSData(mutableだとおもうけど)で受け取ってる物も見受けられるけどやってみた?

tommwo
質問者

お礼

度々ありがとうございます。<(_@_)> 同期通信だと、NSDataでも受取れるようですね。。。 ただ、今回の場合、非同期で行う必要があり、かつ以下のコードにおいて、 NSDictionary *dic = [(NSHTTPURLResponse *)response allHeaderFields]; allHeaderFields というメソッドの戻り値の型が、NSDictionary* であり、 その型でしか受取れないというのが、現状です。。。

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

http://www.google.com/search?hl=ja&q=%22nsdata%22%20shift_jis%20%E5%A4%89%E6%8F%9B どうやら NSString の dataUsingEncoding ってので変換が要るみたい

tommwo
質問者

お礼

早速のご回答ありがとうございます。 ご教示頂いたページを参考に試してみましたが、 やはり正しいと思われるバイト列が返ってきません。 1:NSString* str = [dic objectForKey:@"Icy-Name"]; 2:NSData* sjisData = [str dataUsingEncoding:NSShiftJISStringEncoding allowLossyConversion:YES]; 1の段階の str に、既に x00 が補填されたShift-Jis文字列が返されているため、 sjisData には、解析不能なバイト列が返されます。(T^T)

関連するQ&A

  • 文字化けで混乱中です...

    こんにちは。PHPの文字化けで混乱しており、どなたかにご助言いただければ幸いです。 現在、PHPは拡張子「.php」、HTMLは拡張子「.html」で動いているものを 拡張子「.html」でもPHPを動作させたいので、.htaccessにて AddType "application/x-httpd-php; charset=Shift_JIS" .php .html と指定しました。 これで拡張子「.html」でもPHPが動かせるようになりましたが、それとともにPHPスクリプトの入っていない他のHTMLファイルが文字化けしてしまうようになりました。 しかし、.htaccessに AddType "application/x-httpd-php; charset=Shift_JIS" .php .html AddType "text/html; charset=Shift_JIS" .html こうしてしまうとPHPが効かなくなるし...うーん?と 多分スゴイ手前のところで混乱してきてしまいました。 HTMLファイル内ではmetaでShift-JISを設定しています。 HTMLファイル内でheaderとかやらない方法で、文字化けを回避する方法をお教えいただけますと助かります。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 文字化け

    とても初歩的な質問で申し訳ありません。 友人のホームページが文字化けしていてどうしていいのか分からない様子。 私自身もHPを作成しておりますが、まだやり始めたばかりで、文字コードはshift_jisと指定しているのにどうして?と頭を悩ませています。 どうかお助けください!

    • ベストアンサー
    • HTML
  • 日本語と韓国語の混在入力と文字化けについて

    ホームページ上の掲示板で、韓国語を入力したとき、 Windows98SE IE6.0 エンコードがShift-JISでは韓国語入力ができ Windows2000 IE6.0 エンコードがShift-JISでは書き込んだときは 韓国語がの日本語EUCコードの文字に化けしてしまいます。 この掲示板はUNICODEでないため、韓国語が入力できること自体 不思議なのですが、どうしたら、文字化けせず韓国語と日本語の 混在が可能でしょうか?

  • 文字化けを直すには

    現在別のサイトで使ったメールフォームを元に、別のメールフォームを作り直しているのですが、 文字化けが発生してしまいます。 元々のサイトで使っていたメールフォームのエンコードはUTF-8で、今回はshift-jisになるので メタタグで文字コード宣言をshift-jisにしているのですが、それでも文字化けが起こります。 エンコードをutf-8にすると直ります。 修正の仕方を調べても文字コードの宣言しか見当たらないので、どのように修正してよいか わかりません。 原因等わかる方がおられましたら教えてください。

  • 文字化けします

    またまた質問で申し訳ないんですが、よろしくお願いします。 Servletで表示させる文字が化けます。 ServletのdoGet()を呼び出しています。 ServletをURLにて直接呼び出しているので、doGetで間違いないと思います。記述としては、 response.setContentType(text/html;charset=Shift_JIS); と記述しています。 過去の質問等も調べて、byteに変換してJISAutoDetectを指定しても直りませんでした。 str = new String(str.getBytes("iso-8859-1"), "JISAutoDetect")としました。 8859-1も、同様に駄目でした。 そして、tomcatを起動した時に出るDos窓に 「Unsuported encoding: Shift_JIS」 と出ているのですが、tomcat3-1-4ではサポートされてないのでしょうか?? なんとか、解決策ってないでしょうか? 教えてください。よろしくお願いします。

  • JSPでincludeファイルの日本語が文字化けします。

    tomcat3.1を使用しています。 JSP本体でcharset=Shift_JISを設定し、SJISコードで記述した文字は正常に表示されますが、 <%@ include file="file.html" %>にて読み込んだfile.htmlに記述した日本語が文字化けします。 file.htmlが文字化けしないようにする方法を教えてください。

  • ネットにのせると文字化けしてしまう

    ソフトを使わずに自分でタグを使ってHP作っています。ウインドウズXPです。 ブラウザではOKなのですがネットにあげると一部の決まった文字が化けてしまいます。 名前の「名」が「吊」になど。 文字コードのshift_jisなどはきちんと入れています。 この直し方、どなたかお願いします。

  • Rでの文字化けについて/mac

    Rで日本語を入力しようとすると下記のように3桁区切りのコードに文字化けしてしまいます。 ______________________ > x <-('あ') > x [1] "\343\201\202" ______________________ csvファイルを読み込む時に化けてしまうことに気付いたのですが、read.csv('sample.csv',fileEncoding = 'Shift_JIS')など様々なことを試したのですができませんでした。 Mac OS 10.15.4でR4.0です

  • HTMLの文字化け

    自分で立ち上げたサーバへWindoswで作成したHTMLをアップしてブラウザから表示の確認をしてみたところ、日本語が文字化けてしまいました。 ヘッダーには <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> として、文字コードをUTF-8にしてあるのですが、この部分を <meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS" /> とShift-JISにしてみると、日本語の文字化けが解消します。 できればcharset=UTF-8の状態で文字化けせずに表示してくれるようにしたいのですが・・・ どなたか原因がお分かりになる方いらっしゃいましたら、ご教授のほどお願い致します。 テキストエディタはK2Editorを使用しており、「保存時の文字コードと改行種類の変更」でHTMLファイル自体の文字コードは「Shift-JIS」、改行コードは「CRLF」としております。 サーバは、CentOS5.4を使用しており、 コマンドで # printenv | grep LANG の結果は、 LANG=ja_JP.UTF-8 となっております。

    • ベストアンサー
    • HTML
  • 2バイト文字が文字化けする!

    次の条件でデータが送られてくるのですが、エディタで開くと2バイトのところだけ文字化けします。 きちんと2バイト文字を表示させたいのですが、なにか方法はありますでしょうか? 教えてくださいますよう、宜しくお願いします。 【使用コード】 ・1バイト文字:JIS X0201(1976)に準拠するJIS8コードセット ・2バイト文字:新JIS(JISC6226-1983)に準拠するコード 使用OS:Windows2000Pro 使用エディタ:EmEditor v3