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として解釈しようとするため、化けることがあります。
WebサーバはApacheでしょうか?
Apacheの場合、httpd.confのAddDefaultCharsetでISO-8859-1がインストールデフォルトで設定されているので、これを無効にしないとヘッダでISO-8859-1が明示されるため、METAよりもこちらが優先されてSJISやEUCは化けることがあります(UTF-8だけは検出されます)
ソースにBOMが付いていませんか? BOMがあると、UTF-8として認識されるため、SJISをUTF-8として解釈しようとするため、化けることがあります。
どうもありがとうございます。
xreaサーバーなので、Apacheだと思います。
一応phpのファイルでBOMをつけないで保存してみましたが、
文字化けしてしまいました・・・。
初めの段階で、
$out = mb_convert_encoding($out, "SJIS", "UTF-8");
を書かなければ正常に表示されます。
その場合、
<meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS">
を
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
としても、正常に表示されます。
文字コードについて、ちょっとわけがわからなくなってます・・・。
HTTPのヘッダじゃないかしら。
httpd.confや.htaccessで制御することもできますが、PHPでやるなら、これ書いてみて。
header( 'Content-type: text/html; charset=UTF-8' );
どうもありがとうございます。
echoの1行前に入れてみましたが、ダメでした。
$outの前でもダメでした・・・。
$out = mb_convert_encoding($out, "SJIS", "UTF-8");
を
$out = mb_convert_encoding($out, "UTF-8", "UTF-8");
にすると正常に表示され、
$out = mb_convert_encoding($out, "SJIS", "SJIS");
にすると、だいたい正常に表示されるのですが、
一部の文字、例えば ) 等が「?」に文字化けしたりしています。
何かくだらないミスをしてそうな気がしてきました・・・。
charset 名が間違っています。
charset=Shift-JIS
じゃなくて、
charset=Shift_JIS
です。
どうもありがとうございます。
た・たしかに・・・。
修正してみましたが、表示は変わらずダメでした。
表示したページのソースを見て、
そのHTMLソースをテキストエディタで
文字コードをShift_JISにして読み直すと、
正常な文字列になります。
ただ、一番初めの
・ソ・ソ・ソ・ソ・ソ・ソ
という謎の文字列が出現しました。
$outには、
$out = '
....
...
';
という感じで入れてあります。
問題点の切り分けから...
metaタグは単なるお知らせらしいので、これを変えただけでは思うように変わりません。
エンコードの場合、
と指定できるところがあり、ブラウザによってどれを見ているかは様々です。
実際に Xrea で、UTP-8 で書いたものを Shift-JIS に変換して出力してみましたが、手元の携帯ではチャンと見えています。(もっとも、最近の携帯は UTF-8 のページもチャンと見る事ができるようですが)
どうもありがとうございます。
・文字化けは、携帯とPC両方なります
・文字化けは、全ての文字で発生します
・ブラウザで見ると、euc/utf-8/shift-jis/jis全てダメでした
・Shift-JISで再保存しましたが、ダメでした
・mbstring.http_outputは書いていないです
確かに最近はUTF-8でも見ることができますよね。
初めはそれでいこうとしたのですが、
はてながShift-JISっぽいからあわせようかなぁと思ったら
ハマッてしまいました・・・。
絵文字で文字化けしているのでしょうか?
SJIS-winという文字コードを使えば解消されるかもしれません
どうもありがとうございます。
絵文字は使っていないです。
絵文字が入ると、これまたややこしくなりそうですね。
先にチェックしておきますね。
SJIS文字コード下で str_replace などの置換系の関数を使用して
日本語の文字列を日本語で置換したりすると、
「・ソ・ソ・ソ・ソ・ソ・ソ」のような文字化けを起こした記憶があります。
そういった処理があった場合は、一度置換する文字と置換される文字、両方を(UTF-8、EUC-JP)などに変換してから、str_replace などを行い、また SJIS に戻してやる必要があります。
見当違いでしょうか?
どうもありがとうございます。
置換処理も修正してみましたが、
ソは出てきました・・・。
どうもありがとうございます。
xreaサーバーなので、Apacheだと思います。
一応phpのファイルでBOMをつけないで保存してみましたが、
文字化けしてしまいました・・・。
初めの段階で、
$out = mb_convert_encoding($out, "SJIS", "UTF-8");
を書かなければ正常に表示されます。
その場合、
<meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS">
を
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
としても、正常に表示されます。
文字コードについて、ちょっとわけがわからなくなってます・・・。