うまく表示できているのですが、疑問点があるので質問させてください。
PHP側の文字コードの設定は
internal_encoding:euc-jp
http_output:sjis
HTML側で
<meta charset=Shift-JIS>
で表示しています。
処理内容主な流れは
・サーバー側でEUC_JPのデータをUTF-8に文字コード変換
・json_encode()でjsonデータに変換して、echo $jsondata;
・JS側で受け取ってjQuery.parseJSON()でオブジェクトを取得してそのまま表示させています。
疑問点ですが、サーバー側でUTF-8に変換したデータが自動的にSJISに変換されているように見えるのですが、
どのタイミングでSJISに変換されてるんでしょうか。
また自動的に変換されているのであれば、SJISへの変換を明示的に指定するような記述を入れた方が良いような気がするのですが、どうなんでしょうか。
よろしくお願いします。
最近のウェブブラウザであれば例外なく、JavaScriptエンジンからドキュメントデータを読み書きする際に、ドキュメントデータのエンコードにあわせて自動変換されます。だから気がつかないのです。
以下のhtmlをいろいろな文字コードで保存して実行してみればわかるかと。何で保存していても、JavaScriptからは同じUTFのコードで見えます。
<html><head> <script language=JavaScript> function dump(){ S=document.getElementById('dumpTarget').firstChild.data.toString(); D=[]; for (i=0;i<S.length;++i) D.push(S.charCodeAt(i).toString(16)); alert(D); } </script></head><body onload="dump()"> <p id="dumpTarget">京</p> </body></html>
追記: 念のため — 厳密に言うならば、JavaScript エンジン上のStringの文字コードは常に UTF-16 です (ECMAScriptの規格でそう定められている)。ですので、サーバから UTF-8 で来たjsonデータが、ブラウザ側の XMLHttpRequest を通過する際に UTF-16 に変換されていて、それがさらにDOM経由でドキュメントに読み書きする際にドキュメントのエンコードに変換される、という流れになります。いずれにせよ JavaScript エンジンを出入りする際のエンコード変換は、おおむね仕様に定められた通りに自動的かつ強制的に行われるものなので、手動で何かする余地も必要もありません。
internal_encoding:euc-jp
http_output:sjis
これでは、内部エンコーディングをEUC-JPにして、httpの出力をSJISに設定しているように見受けられます。
従ってサーバ内ではEUC-JPをSJISにする処理が行われるだけで、UTF-8は処理に関係ないでしょう。