狐の王国

人は誰でも心に王国を持っている。

Macの合字ファイル名で困ったときにはUnicode::Normalizeで処理すべし

何やら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);
}

というわけで教えてくれたみんなありがとう!!

Rubyの場合は?

IconvでUTF-8-MACから変換してやればできるはず、と教えてくれた人もいたのだけども、どうやらglibcがまだUTF-8-MACに対応してないみたい。
#272727 - [iconv] Support for UTF-8-MAC - Debian Bug report logs
Debianにもwishlistには入ってるみたいだけど、もう4年も前か……。samba方面なんかでも困ってる人いるみたいなので、早いところglibcにもUTF-8-MACが入るとうれしいね。AppleがLGPLでリリースしてるようだから、問題なく取り込まれていいはずなんだけども。

Sugano `Koshian' Yoshihisa(E) <koshian@foxking.org>