Ruby on Rails/JSONPで受け取ったデータをEUC-JPのWebページに埋め込むには? http://www.ark-web.jp/sandbox/wiki/196.html
Ruby on Rails/JSONPで受け取ったデータをEUC-JPのWebページに埋め込むには?
- Ruby on Railsを使って構築しているシステムで、ブログパーツをJSONPを使って提供する、ということをやったのでそのメモです。
- JSONというgemがあり、これを使ってハッシュなどを簡単にJSONにすることができるのでこれでやってみました。
とりあえずJSONを出してみる †
- まずはJSONをgemでインストール
$gem install json
- ソース
require "json" render_text({"name" => "志田 裕樹"}.to_json)
- 結果
{"name":"\u5fd7\u7530 \u88d5\u6a39"}
この\uXXXXは? †
- ECMA-262 3rd EditionやRFC 4627をみると、JavaScriptやJSONは本来はUnicodeか、JavaScript::UCS *1 を使って記述するべき、らしいです。
- なので、gemのJSONはJavaScript::UCSを使って結果を返してくれたわけですね。
- JavaScript::UCSは、BMPをuXXXXの形式にしたものらしく、BMPというのはつまりUCS-2という文字コードらしく、これはUnicodeファミリー(?)の一つらしい。なのでEUC-JPを\uXXXXのような形式に直してもだめだろう、と思います。
EUC-JPやShift_JISのページにJSONで受け取った内容を埋め込むには? †
- ブログパーツなので、埋め込まれるWebページは、日本だとEUC-JP, Shift_JIS, UTF-8などは最低でもおさえておく必要があります。
- 普段JavaScriptのStringをHTMLの中にDOMで埋め込んだりする場合は、Stringの中にそのWebページの文字コードと同じ文字コードの文字列をいれておけば、うまく表示されます。(ECMA-262 3rd Editionによるとこれは本当はNGってことになると思うのですが)
- なので、荒業ですが「JSON.support_unicode = false」で文字列のJavaScript::UCSへの変換を抑制して、EUC-JPなどの文字列をそのまま出してしまいます...
- コード
headers['Content-Type'] = "text/html;charset=euc-jp" require "json" require "kconv" JSON.support_unicode = false render_text({"name" => "志田 裕樹".kconv(Kconv::EUC, Kconv::UTF8)}.to_json)
- 結果
{"name":"志田 裕樹"}
これでEUC-JPのページに埋め込むことができました。 - 結論
JSONPの提供元はEUC-JPなどでサイトを作っているユーザーのために、文字列の文字コードがEUC-JPのバージョンも用意する必要がある... (もっといい方法なのかなぁ )
tag: Ruby on Rails, JavaScript, JSON, JSONP