何やらMacな人から頂いたファイルだの自分のMacからDebianに持ってきたファイルだのが合字(リガチャ, ligature)になってることがあって、Debianのターミナルなんかでは正常に表示されなかったりする。
合字っていうのはWikipediaの合字の項目を見るとわかるけども、複数の文字が結合されたものね。
日本語だと濁点や半濁点を、Macは合字として扱う。つまり「ぱ」ではなく「は゜」と2文字になってて、それを表示するときに1文字幅で表示させる(合字にする)わけね。
というわけでこれ処理するライブラリないのかなーとIRCで相談してみたら、Unicode::Normalizeを使えとのお達しが。
From Cとか From Dとかよく意味がわからないんだけども、一緒に教えてもらったUAX #15: Unicode Normalization Formsをの図を見ると少し意味がわかった。
- NFD(Normalize From D)
- 「ぱ」を「は゜」にする
- NFC(Normalize From C)
- 「は゜」を「ぱ」にする
とりあえずこれだけ覚えとけばいいのかな。
とりあえず変換するだけだとこんな感じ。これでそのままリネームとかさせよっかな。
#!/usr/bin/perl use strict; use warnings; use utf8; use Encode; use Unicode::Normalize qw/NFD NFC/; my $encoding = $ENV{LANG} =~ /euc-?jp/i ? 'euc-jp' : 'utf-8'; binmode STDOUT, ":encoding($encoding)"; binmode STDERR, ":encoding($encoding)"; while(<>) { my $utf8 = Encode::decode('utf8', $_); print NFC($utf8); }
というわけで教えてくれたみんなありがとう!!