CGIでフォームから送信された文字列をJSONにエンコードしていたときの話です。
キーは英数字、値をUTF-8の文字列にした場合、エンコードした結果をSTDOUTに出力した場合は問題ないのに、DBに格納すると化けるという不思議な現象が発生しました。
「Perl JSON 文字化け」なので検索すると色々出てきますが、どれも参考にならず。「to_json()」も「encode_json()」もダメで、適当にいじっていたら「JSON->new->latin1->encode()」が正解でした。
とはいえ、なぜそうなのかが不明なので、環境によっては動かないかもしれません。
とりあえず、文字コード周りはエンコードを回避するためのパラメータを用意しておいて欲しいものです。
あと、JSONはpureperlなので、スクリプトをアップする際には使用したモジュールをコピーしておくと、動作が保障されると思われます。
でめたしでめたし。
8月 11
7月 17
自作CMSでJSONを使うことにしました。
最近あまり使っていませんが理屈はわかっています。JavaScriptではevalです。
ではなくて、PerlではJSONモジュールを利用すれば問題ない、はずでした。
結論から言うと、ローカルのテスト環境と、coreserverではJSONモジュールのバージョンが違うためにサブルーチンが見つからないとかいわれて怒られていたのでした。
ローカルの環境では2.21、coreserverは3年前の1.14で、to_jsonやfrom_jsonがありません。幸いなことにJSONhaPurePerlなのでコピーするだけでも動きます。
ということで、ライブラリパスを追加するのですが、pushではダメです。
先に読んでくれないと困るのでunshiftします。
BEGIN{ unshift @INC, (./'; }
これで問題なく動くようになりました。
ちなみに、unshiftではなくてpushを使ってしまっていて、なぜ新しいバージョンを読まないのだろうと数時間悩んだなんて恥ずかしくていえません。
なにはともあれでめたしでめたし。
Recent Comments