Macでファイル名に濁音、半濁音を利用したらハマった。

Ruby1.9で文字列比較していたら、同じ文字列のはずなのに一致しなくて悩んでいた。なので、String#dumpしてみると…

>> puts filname.inspect
=> "うぃきぺいじ.md"
>> p filname.dump
=> "\"\\u{3046}\\u{3043}\\u{304d}\\u{3078}\\u{309a}\\u{3044}\\u{3057}\\u{3099}.md\""
>> puts str2.inspect
=> "うぃきぺいじ.md"
>>  p str2.dump
=> "\"\\u{3046}\\u{3043}\\u{304d}\\u{307a}\\u{3044}\\u{3058}.md\""

ファイル名が「うぃきへ゜いし゛」になっていました。

どうやらMac OSXではファイル名を俗称UTF8-Macという方式を利用しているらしい。この方式では、濁音を全て分割し、表示する際に合成しているとのこと。Macのgitでも長らくこの方式に対応していなかったそう。

ということで、UTF8-MacをUTF8に変換してやりましょう。

>> puts filname.inspect
=> "うぃきぺいじ.md"
>> filname.encode('utf-8', Encoding::UTF8_MAC).dump
=> "\"\\u{3046}\\u{3043}\\u{304d}\\u{307a}\\u{3044}\\u{3058}.md\""
>> puts str2.inspect
=> "うぃきぺいじ.md"
>> str2.encode('utf-8', Encoding::UTF8_MAC).dump
=> "\"\\u{3046}\\u{3043}\\u{304d}\\u{307a}\\u{3044}\\u{3058}.md\""

参考:L'eclat des jours(2011-02-05)