Malheureusement, il est impossible pour une machine de monter / descendre / capitaliser correctement. Il a besoin de beaucoup trop d'informations contextuelles pour qu'un ordinateur puisse le comprendre.
C'est pourquoi la String
classe Ruby ne prend en charge que les majuscules pour les caractères ASCII, car elle est au moins quelque peu bien définie.
Qu'est-ce que j'entends par «informations contextuelles»?
Par exemple, pour capitaliser i
correctement, vous devez savoir dans quelle langue le texte est. L'anglais, par exemple, n'a que deux i
s: majuscule I
sans point et petit i
avec un point. Mais le turc a quatre i
s: une majuscule I
sans point, une majuscule İ
avec un point, une petite ı
sans un point, une petite i
avec un point. Donc, en anglais 'i'.upcase # => 'I'
et en turc 'i'.upcase # => 'İ'
. En d'autres termes: comme 'i'.upcase
peut renvoyer deux résultats différents, selon la langue, il est évidemment impossible de mettre correctement en majuscule un mot sans connaître sa langue.
Mais Ruby ne connaît pas la langue, il ne connaît que l'encodage. Par conséquent, il est impossible de mettre correctement en majuscule une chaîne avec la fonctionnalité intégrée de Ruby.
Cela empire: même en connaissant la langue, il est parfois impossible de bien faire la capitalisation. Par exemple, en allemand, 'Maße'.upcase # => 'MASSE'
( Maße est le pluriel de Maß qui signifie mesure ). Cependant, 'Masse'.upcase # => 'MASSE'
(signifiant masse ). Alors, qu'est-ce que c'est 'MASSE'.capitalize
? En d'autres termes: une capitalisation correcte nécessite une intelligence artificielle à part entière.
Ainsi, au lieu de donner parfois la mauvaise réponse, Ruby choisit parfois de ne donner aucune réponse du tout , c'est pourquoi les caractères non ASCII sont simplement ignorés dans les opérations downcase / upcase / capitalize. (Ce qui, bien sûr, donne également de mauvais résultats, mais au moins c'est facile à vérifier.)