JSONモジュールのutf8フラグの扱いに悩まされていたんだけど、解決したように思うのでメモ。
症状
- from_json($json) の形式でデコード。
- はてなAPIの生の日本語にはutf8フラグは立っていない。(print時に警告が出ない)
- Twitterの \uXXXX な日本語にはutf8フラグが立つ。(print時に警告が出る)
- utf8::is_utf8($str) で確認すると両者とも TRUE と判定される。
- utf8::encode($str) すると、はてなAPIの場合、文字化けする。
対応策
どうやらJSONモジュール(JSON::XS)が嘘のutf8フラグを立てているもようなので、以下で対応。
- from_json($json, {utf8=>1}) の形式でデコードし、強制的にutf8フラグを立てる。これで はてな とTwitterの差異がなくなる。
- 他の文字列と連結する前に、一律 utf8::encode($str) でフラグを落とす。
これで、解決したっぽいけど、JSONモジュールとかのバージョン違いでまた問題が起きそうだな。