Caracteres multibyte UTF-8 em nomes de arquivo do Mac OS X

De blog.bmonkeys.net/posts/20

Eu fiz uma pequena ferramenta CLI que listava arquivos em um diretório mais algumas informações extras em uma tabela ASCII. Para calculá-lo, preciso do nome de arquivo mais longo e tive problemas quando os caracteres multibyte UTF-8 estavam neles: Os caracteres especiais foram contados como dois caracteres.

O problema aqui é que o OS X usa um UTF-8 ligeiramente diferente do que você imagina. Veja isso:

[1] pry(main)> str = File.basename(Dir["Desktop/*"][2])
=> "möp"

[2] pry(main)> str.length
=> 4

[3] pry(main)> "möp".length
=> 3

[4] pry(main)> str.encoding
=> #<Encoding:UTF-8>

[5] pry(main)> "möp".encoding
=> #<Encoding:UTF-8>

[6] pry(main)> str == "möp"
=> false

Nesse ponto, eu estava confuso. Parecia o mesmo, tinha a mesma codificação, mas não é o mesmo (e mais longo). Qual é o truque aqui? Codifique o caminho para UTF-8-MACe tudo ficará bem:

[7] pry(main)> str.encode('UTF-8', 'UTF-8-MAC').length
=> 3

[8] pry(main)> str.encode('UTF-8', 'UTF-8-MAC')
=> "möp"

[9] pry(main)> a.encode('UTF-8', 'UTF-8-MAC') == "möp"
=> true

De blog.bmonkeys.net/posts/20