utf-8でコーディングしていて、
携帯用のサイトなのでShift-JISに変換して
サイトに出力しようと思っています。
$out = mb_convert_encoding($out, "SJIS", "UTF-8");
のようにしてみて、$outをechoしたのですが、
文字が化けてしまいます。
一応$out内のhtmlのhead部分には
<meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS">
と書いてあります。
utf-8で書いてutf-8で出力するのは問題なかったのですが、
まさかshift-jis変換でハマるとは・・・。
shift-jisでプログラムもタグも書いた方が楽な気がしてきましたが、
PC向けサイトのコードとごっちゃになりそうなので、
なんとかutf-8で書いてshift-jisで出力したいです。
何かミスしていそうなところを
アドバイスして頂けると助かります。
WebサーバはApacheでしょうか?
Apacheの場合、httpd.confのAddDefaultCharsetでISO-8859-1がインストールデフォルトで設定されているので、これを無効にしないとヘッダでISO-8859-1が明示されるため、METAよりもこちらが優先されてSJISやEUCは化けることがあります(UTF-8だけは検出されます)
ソースにBOMが付いていませんか? BOMがあると、UTF-8として認識されるため、SJISをUTF-8として解釈しようとするため、化けることがあります。
HTTPのヘッダじゃないかしら。
httpd.confや.htaccessで制御することもできますが、PHPでやるなら、これ書いてみて。
header( 'Content-type: text/html; charset=UTF-8' );
それが原因でしょう。
文字符号化方法を知るまでに ASCII の範囲外のバイト値が現れると、タグを正常に解釈できなくなる可能性があります。
文字符号化方法の指定:
http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401j/charset.html#h-5.2.2
> 正常な文字列になります。
という事は、エンコードの変更は上手く機能していますね。
> ただ、一番初めの
> ・ソ・ソ・ソ・ソ・ソ・ソ
> という謎の文字列が出現しました。
ブラウザのエンコードをいろいろ変えるとチャンと表示できるかも知れませんね。ひょっとすると UTF-8 なのでは?
スクリプトでその文字を出力している部分を探すのが解決の近道では?
どこかで(デバッグ用などで)変数の内容を書き出したり、不用意に出力していませんか?
どうもありがとうございます。
この謎の文字列がよくわからないです・・・。
試しに
$test = mb_convert_encoding("あいうえお", "SJIS", "UTF-8");
echo $test;
とし、その後に
echo $out;
しました。
結果、「あいうえお」も文字化けしていました。
ソースを閲覧し、テキストを「Shift-JIS」で読み直すとソソソと「あいうえお」を含み、全て正常に表示されています。
再度「UTF-8」で読みなおすと、文字化けした同じ内容になりました。
このとき、ソースに「ソソソ」や「あいうえお」は表示されていませんでした。
どうもありがとうございます。
ブラウザのエンコードをいろいろ変えてみましたが、
どうもうまく表示されないです。
少し新しい発見がありました。
IE系のブラウザで見ていたのですが、
firefoxで見てみました。
すると、文字化けせずに表示されていました。
ただ、テキストの初めに
・ソ・ソ・ソ・ソ・ソ・ソあいうおえ
は表示されています。
この
・ソ・ソ・ソ・ソ・ソ・ソ
が出力されている場所を探していますが、なかなか見つからないです・・・。
> が出力されている場所を探していますが、なかなか見つからないです・・・。
すでに結構な規模のプログラムになっているのでしょうか?
プログラムの一部分だけを切り取って、再現するか試してみてはどうでしょう。
あと、差し支えなければそのページのURLをずばりここに書き込んでもらえると、なにかヒントが掴める可能性もあります。
どうもありがとうございます。
小規模なのですが、出力しているところが無いので
何故だろう・・・と思っていました。
先ほど、なんとか解決できました。
コメント欄にもう一度書きますね。
教えて頂いた方法を順に試してもうまくいかず、
思い切ってイチから書き直しました。
少しずつコピペする形で再度初めから書き直したのですが、
少しずつ出力させて確かめていきました。
その結果、正常に表示されました。
そこで、前回と違うところは、
前回は「BOMつき」で保存していて、
途中でアドバイスを頂いて「BOM無し」にしました。
今回は、初めから「BOM無し」で書きました。
そのため、
前回の「BOM無し」で再保存したときに、
ファイル数が多いため、し忘れたものがあったのかもしれません。
確認のため、
今回正常に表示されているファイルを
「BOMあり」に一部してみたところ、
「BOMあり」のファイルを読み込んだ数だけ
「・ソ」が出てきました。
前回は「4個」読み込んだため、
「4個」+「自ファイル」の5つ分「・ソ」が出ていた、
ということかもしれません。
なんとも情けないミスで申し訳ないです・・・。
どうもお騒がせしました。
いろいろアドバイス頂けたおかげで
諦めずになんとか解決できました。
ありがとうございました。
> 前回は「BOMつき」で保存していて、
> 途中でアドバイスを頂いて「BOM無し」にしました。
そういえば、UTF-8 の BOM は「EF BB BF」の3バイトなので、
Shift_JIS として解釈すると「・ソ」となりますね。
# 「EF BB」には文字が割り当てられていないので、
# どういう表示になるかは不定ですが。
> ただ、一番初めの<!DOCTYPE...の前の部分に・ソ・ソ・ソ・ソ・ソ・ソという謎の文字列が出現しました。
この時に、文字コード表を見れば良かった(^^;
> 今回は、初めから「BOM無し」で書きました。
UTF-8 から Shift_JIS に変換したソフト(テキストエディター?PHP?)が、バグっているのかもしれませんね。
そこまで深くわかるんですね・・・。
文字コードにちょっと興味がわいてきました。
エディタは、EmEditor使ってて、
デフォルトでUTF-8だと「BOMつき」みたいです。
今まではShift-JISで書いてり、
UTF-8の修正がメインだったので
あまり気にしたことが無かったのがつまづいた原因だと思います。