2007年06月26日

JSONやData::DumperでのUTF-8データ出力エスケープ回避

Posted by nene2001 at 09:17 / Tag(Edit): json yaml perl utf-8 / 1 Comments: Post / View / 0 TrackBack / Google Maps このエントリーを含むはてなブックマーク

JSONモジュールでデータを出力する際、UTF-8の含まれたオブジェクトをobjToJson関数で変換すると、

    {
      "parent_category_id" : "0",
      "mapplets" : [
        {
          "murl" : "http://rkmt.net/soft/pemapplet.xml",
          "registered" : "2007-06-16 12:34:58",
          "name" : "PlaceEngine Mapplet",
          "id" : "14",
          "description" : "Place Engine \u306e\u30de\u30c3\u30d7\u30ec\u30c3\u30c8"
        }
      ],
      "name" : "\u305d\u306e\u4ed6",
      "id" : 9
    }

みたいな感じでエスケープされてしまい、うまく出力されずに困っていました。

ですが、同じオブジェクトをYAMLモジュールに与えてやるとちゃんと望む結果を返してくれるので、緊急避難的にこんな感じにしたところ、うまくいきました。

    my $ydat = Load(Encode::encode("euc-jp",Dump($dat)));
    print Encode::decode("euc-jp",objToJson($ydat,{pretty => 1,autoconv => 0}));

全く本質的な解決ではなく、YAMLへのシリアライズ/デシリアライズ処理の分遅くなるので、アクセスの多い処理なんかには使えないですし単に要件がシリアライズなら素直にYAML使っておけという感じなのですが、JSONで出すのが必須でかつ、今回の私の場合のような1日1回のバッチ処理とかならば、その程度なら上記で簡易に逃げられそうです。
本質的な解決方法ご存知の方は教えていただければ幸いです。

同じやり方で、以前悩んでたData::Dumperのエスケープも回避できるのを確認しましたが、Data::Dumperこそ基本的な用途はシリアライズでしょうし、そんならそのままYAMLが使える(し、むしろ判り易い)ので使い道ないでしょうね...。

----- 追記 -----

コメントで

$JSON::UTF8 = 1 のようにしてみるのはどうでしょうか?

といただきましたが、それについては対応しておりました。

ですが、直接JSONモジュール作者のまかまかさんにメールで尋ねたところ、

これはJSON 1.08でRFC4627に対応しようとして(というかJSON::XS互換に近づけようとして)不十分なままリリースしたために発生する問題です。
解決方法としては1.07かそれ以前のものを使う、あるいは最新のJSONに同梱しているJSON::PPを使ってください。

という回答をいただきました。
普遍的な問題ではなく、たまたま私が使ったタイミングが悪かっただけの一時的な問題だったようです。

さらには、はてブで指摘されたのですが、

そもそも unicode escape で何が問題なんだろう

ええ、だってそのままじゃJavaScriptとして送れないじゃん、と思ったものの、もしかしてそういう指摘をされるということは、JavaScriptでそのまま認識できるの?と思ってunicode escapeされたJSONデータをJavaScriptで読み込んでみたら、普通に読めました...。
別に根拠もなく、JavaScriptでは読めないものと思い込んでしまっておりました。
いや、読めるなら何の問題もないんです...無駄な事に時間を使ってしまいました...。

Related query words in Google & Yahoo
Related Books from Amazon
Trackback to this entry
TrackBack URL :
Trackbacks
トラックバックはありません。
Comments

$JSON::UTF8 = 1 のようにしてみるのはどうでしょうか?

POD より:
UTF8
You can set a true value into $JSON::UTF8 for JSON::Parser and
JSON::Converter to set UTF8 flag into strings contain utf8.

Posted by: たけまる at 2007年06月26日 10:30
Post a comment












Remember personal info? 
2007年06月
Su Mo Tu We Th Fr Sa
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

About Me

Navigation

Search
Google
Web
kokogiko.net
Archives
Recent Entries
Recent Comments
Recent Trackbacks
姫路のオモシロ寿司屋(ここギコ!)
0系こだまとひかりレールスターに乗ってきた ドクターイエローも見た
姫路のオモシロ寿司屋(ここギコ!)
位置情報ベース広告AdLocalへ一般からも入札が可能に
「定義できない」とのたまうものを自説根拠の説明の中で延々と使う不誠実(笑)(ここギコ!)
文化は変わっていくのは当たり前だからこそ、今問われているのはリアルタイムの選択
現代アイヌの政治運動は利権獲得のためのようだな。(むにゅう!の平和大好き! はてな基地)
文化は変わっていくのは当たり前だからこそ、今問われているのはリアルタイムの選択
的外れですた恥ずかしい Googleは世界標準の絵文字を作ろうとしてるわけではない、少なくとも、今のところ(ここギコ!)
絵文字標準化でのキャリア批判に思うこと
すごい職場の活性法(これが答えだ)
人員がクラスタ化できている職場と言うのはうらやましい そろそろ限界です
文化は変わっていくのは当たり前だからこそ、今問われているのはリアルタイムの選択(ここギコ!)
大和民族の定義云々について
歴史のダイナミズムの元では右翼こそ変わらなければならない(ここギコ!)
右翼はアイヌや沖縄を包摂する論理を構築すべきではないのか
右翼はアイヌや沖縄を包摂する論理を構築すべきではないのか(ここギコ!)
大和民族の定義云々について
政治と祭祀が不可分と考えるなら、全ての祭祀を引き受けるのが筋(ここギコ!)
大和民族の定義云々について
Hatena bookmarked
My del.icio.us

Banners

Syndication
Powered by
Get it!!