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-MAC
e 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