人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

WebサイトでPHP + JSON で日本語の出力しているのですが
うまく表示できているのですが、疑問点があるので質問させてください。

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への変換を明示的に指定するような記述を入れた方が良いような気がするのですが、どうなんでしょうか。

よろしくお願いします。

●質問者: timestep
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● holoholobird
●0ポイント

internal_encoding:euc-jp
http_output:sjis

これでは、内部エンコーディングをEUC-JPにして、httpの出力をSJISに設定しているように見受けられます。
従ってサーバ内ではEUC-JPをSJISにする処理が行われるだけで、UTF-8は処理に関係ないでしょう。


timestepさんのコメント
JSONデータUTF-8にサーバー側で変換しています。これも最終的にSJISで出力されています。 聞きたいのはこのデータがどのタイミングで変換されているか、なのですが。

Lhankor_Mhyさんのコメント
>> UTF-8は処理に関係ないでしょう。 << それは勘違いだと思います。 >http://php.net/manual/ja/function.json-encode.php:title> この関数は、UTF-8 エンコードされたデータでのみ動作します。 <<

2 ● ghost
●50ポイント ベストアンサー

最近のウェブブラウザであれば例外なく、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 エンジンを出入りする際のエンコード変換は、おおむね仕様に定められた通りに自動的かつ強制的に行われるものなので、手動で何かする余地も必要もありません。


timestepさんのコメント
回答ありがとうございます。(ドキュメントのエンコードに自動的に変換され)手動で何かする余地はないとわかり、勉強になりました。 ただサンプルコードなのですが、手元の環境で実行してみたところ(MacOS,Chromeブラウザ) SJISで保存したとき「4eac」 UTFで保存したとき「830a,ff6c」 EUCで保存したとき「ff75,1a」 とアラートで出てきて、同じコードにならないのですが。

Lhankor_Mhyさんのコメント
横からすみません。 サンプルコード試してみましたが、Chromeは文字コードが指定されていないHTMLを開く時には前回と同じエンコードをするようですね。おそらく文字化けしているはず。 ですから「自動判別でs-jis表示」→「ソースコードをeucに変更」→「リロードしてもs-jis表示」となっているようです。 エンコードを確認しながら試してみるとよろしいのではないでしょうか。

timestepさんのコメント
なるほど。metaタグで文字コードを指定しながら確認したところ すべて同じコードになるのを確認できました。ありがとうございます。

3 ● Lhankor_Mhy
●50ポイント

モノを見てないので憶測で書きますが、JavaScriptでDOM操作を行った時にブラウザによって、だと思います。
JSONの出力はutf-8になってるかと思います。
JavaScriptとJSONの文字コードはunicodeですから、それ以前でs-jisに変換される理由がないです。


timestepさんのコメント
ブラウザのようですね。ありがとうございます

4 ● だわかき
●0ポイント

http_output:sjis と設定されているので、SJISでhttp送信されます。
http://www.php.net/manual/ja/mbstring.configuration.php#ini.mbstring.http-output

http出力する直前に文字コード変換が起きます。
echoやprintなど出力関数は問いません。http出力する直前に変換されます。


timestepさんのコメント
他の方の回答によりますと、サーバー側では変換してないようですね。

だわかきさんのコメント
http_output が sjis に設定されており、 output_handler が mb_output_handler に設定されており、 http 出力が text/html であるとき(echo関数ではそうなる)、 サーバ側でSJISに自動変換されます。 http://lets.postgresql.jp/documents/tutorial/with_php/utf8_as_int_enc/

timestepさんのコメント
今回の場合、サーバー側ではinternal_encodingであるEucJPをSJISに変換してるのであって UTF8のJSONデータについてはサーバー側では変換してないようです。 echoしてるJSONデータはUTF8したものがUnicodeに変換されたデータで、そのタイミングでは変換されていないということのようです。Unicodeのままブラウザは受け取ってるようです
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ