2007年06月26日
JSONやData::DumperでのUTF-8データ出力エスケープ回避
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では読めないものと思い込んでしまっておりました。
いや、読めるなら何の問題もないんです...無駄な事に時間を使ってしまいました...。
$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.
![[ここギコ!]](http://kokogiko.net/logo.png)



・「定義できない」とのたまうものを自説根拠の説明の中で延々と使う不誠実(笑)(むにゅう!)
・絵文字標準化でのキャリア批判に思うこと(kokogiko)
・文化は変わっていくのは当たり前だからこそ、今問われているのはリアルタイムの選択(むにゅう!)
・絵文字標準化でのキャリア批判に思うこと(ひゅ〜)
・絵文字標準化でのキャリア批判に思うこと(kokogiko)
・文化は変わっていくのは当たり前だからこそ、今問われているのはリアルタイムの選択(kokogiko)
・文化は変わっていくのは当たり前だからこそ、今問われているのはリアルタイムの選択(むにゅう!)
・文化は変わっていくのは当たり前だからこそ、今問われているのはリアルタイムの選択(むにゅう!)
・文化は変わっていくのは当たり前だからこそ、今問われているのはリアルタイムの選択(むにゅう!)