Infelizmente, é impossível que uma máquina faça upcase / downcase / capitalize corretamente. Ele precisa de muita informação contextual para um computador entender.
É por isso que a String
classe Ruby suporta apenas letras maiúsculas para caracteres ASCII, porque é pelo menos um pouco bem definida.
O que quero dizer com "informação contextual"?
Por exemplo, para capitalizar i
corretamente, é necessário saber em qual idioma o texto está. O inglês, por exemplo, possui apenas dois i
s: capital I
sem ponto e pequeno i
com ponto. Mas o turco tem quatro i
s: capital I
sem ponto, capital İ
com ponto, pequeno ı
sem ponto, pequeno i
com ponto. Então, em inglês 'i'.upcase # => 'I'
e em turco 'i'.upcase # => 'İ'
. Em outras palavras: como 'i'.upcase
pode retornar dois resultados diferentes, dependendo do idioma, é obviamente impossível capitalizar corretamente uma palavra sem conhecer seu idioma.
Mas Ruby não conhece o idioma, apenas conhece a codificação. Portanto, é impossível capitalizar adequadamente uma string com a funcionalidade interna do Ruby.
Piora: mesmo com o conhecimento do idioma, às vezes é impossível fazer uma capitalização adequada. Por exemplo, em alemão 'Maße'.upcase # => 'MASSE'
( Maße é o plural de Maß que significa medição ). No entanto, 'Masse'.upcase # => 'MASSE'
(significando massa ). Então o que é 'MASSE'.capitalize
? Em outras palavras: capitalizar corretamente requer uma Inteligência Artificial completa.
Assim, em vez de às vezes dando a resposta errada, Ruby opta por vezes, dar nenhuma resposta em tudo , e é por isso caracteres não-ASCII simplesmente ignorados em downcase / upcase / capitalizar operações. (O que, é claro, também indica resultados errados, mas pelo menos é fácil verificar.)