perl の YAML.pm と Unicode

  • YAML::DumpFile で utf8 フラグが立った文字列をダンプすると 'Wide character ...' と警告が出る(どうやって防ぐ?)
use utf8;
use YAML;
$a = '漢字';
YAML::DumpFile('a.yaml', $a);
  • 上のコードで a.yamlutf-8 で出力される.次に読み込んでみる.
use utf8;
use YAML;
$a = YAML::LoadFile('a.yaml');
print $a;
  • 一見うまくいっているように見える.しかし次のようにすると失敗する.
use utf8;
use YAML;
binmode STDOUT, ':utf8';
$a = YAML::LoadFile('a.yaml');
print $a;
  • これは,$a がバイト列(中身はたしかに「漢字」の utf-8 表現)として扱われているから(utf8::is_utf8($a) が false).この場合には以下のようにしなければならない.
use utf8;
use YAML;
binmode STDOUT, ':utf8';
$a = YAML::LoadFile('a.yaml');
utf8::decode($a);
print $a;
  • これでは巨大なデータを読んだとき面倒なので,以下のようなハックがある.
use utf8;
use YAML;
binmode STDOUT, ':utf8';
$a = YAML::LoadFile('a.yaml');
$yaml = YAML::Dump($a);
utf8::decode($yaml);
$a = YAML::Load($yaml);
print $a;