- 締切済み
JSONエンコードの際の問題
PHP5.2.6とJavascriptの間で、JSONを用いてデータをやり取りしていますが、JSONエンコードの際に文字列がUnicodeエスケープ(\u3000のような形)されてしまい、データサイズが肥大化して困っています。 本来3バイトで良いところを6バイト消費していますので、全体としては約2倍弱のサイズのデータをやり取りすることとなってしまいます。 UTF-8のまま出力するライブラリ等はありませんでしょうか? php-jsonやJsphon等を試してみたのですが、いずれもUnicodeエスケープされたjson文字列が出力されてしまいました。 宜しくお願い致します。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- SortaNerd_
- ベストアンサー率59% (309/522)
urlencodeでは同じく2バイト→6バイトなので解決になりませんね。 それでいくならUTF-7でしょうか。かなりマイナーなエンコーディングですが。
JSONのエンコーディングについては、RFC 4627で規定されている。それによると、エンコーディングはUnicodeが望ましく、その場合は0..127範囲外の文字はユニコードエスケープする、とある。だから、一般的にはみんなそれにしたがって処理する形に実装されているんでないだろうか。 >UTF-8のまま出力するライブラリ等はありませんでしょうか? そのままといっても、まさか日本語をそのまま送るわけにはいかないから、何らかの形でASCII文字のデータにエンコードはしないといけない。どういうエンコードをして送ろうと考えているんだろうか。 例えばだが、一つの案として、事前に日本語をすべてurlencodeしたものをJSONオブジェクトにまとめて送信し、受け取った側で再びデコードして使う、というようなやり方はどうだろうか。ASCII文字に変換されていればユニコードエスケープはされないはずで、日本語をすべてユニコードエスケープよりはデータサイズは小さく収まると思うが。
お礼
追記です。 URLエンコードですとおそらくデータ量は1.5倍になります。 unicode escaped…6byte/1mb文字 URL encoded…3*3=9byte/1mb文字
補足
御回答ありがとうございます。 確かにRFC4627には「JSON は Unicode で表記すべきである。」との表記がありますね… ただ、参考までにGmailのソースを見てみましたが、JSON内にUTF-8で直接文字列が書き込まれています。 これは仕様を無視して転送量削減のためにJSON周りをHackしているという認識でよろしいでしょうか? また、それを実現するようなライブラリ等を御存知でしたら御教示ください。 宜しくお願い致します。
お礼
ありがとうございました。UTF-7についても少し調べてみます。