- 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;
参考