JSONのutf8フラグを落とす

JSONモジュールのutf8フラグの扱いに悩まされていたんだけど、解決したように思うのでメモ。

症状

  1. from_json($json) の形式でデコード。
  2. はてなAPIの生の日本語にはutf8フラグは立っていない。(print時に警告が出ない)
  3. Twitterの \uXXXX な日本語にはutf8フラグが立つ。(print時に警告が出る)
  4. utf8::is_utf8($str) で確認すると両者とも TRUE と判定される。
  5. utf8::encode($str) すると、はてなAPIの場合、文字化けする。

対応策

どうやらJSONモジュール(JSON::XS)が嘘のutf8フラグを立てているもようなので、以下で対応。

  1. from_json($json, {utf8=>1}) の形式でデコードし、強制的にutf8フラグを立てる。これで はてなTwitterの差異がなくなる。
  2. 他の文字列と連結する前に、一律 utf8::encode($str) でフラグを落とす。

これで、解決したっぽいけど、JSONモジュールとかのバージョン違いでまた問題が起きそうだな。