2007-08-24

Perl の YAML.pm と Unicode

  • YAML::DumpFile で utf8 フラグが立った文字列をダンプすると 'Wide character ...' と警告が出る(どうやって防ぐ?)
  • use utf8;
    use YAML;
    $a = '漢字';
    YAML::DumpFile('a.yaml', $a);
    
  • 上のコードで a.yaml は utf-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;
    
  • 参考

0 件のコメント:

コメントを投稿