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 Stringclasse 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 icorrectement, vous devez savoir dans quelle langue le texte est. L'anglais, par exemple, n'a que deux is: majuscule Isans point et petit iavec un point. Mais le turc a quatre is: une majuscule Isans point, une majuscule İavec un point, une petite ısans un point, une petite iavec un point. Donc, en anglais 'i'.upcase # => 'I'et en turc 'i'.upcase # => 'İ'. En d'autres termes: comme 'i'.upcasepeut 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.)