Question Convertir un caractère en majuscule


J'ai une variable qui contient un seul char. Je veux convertir ceci char en majuscule. Cependant, le to_uppercase la fonction retourne un rustc_unicode::char::ToUppercase struct au lieu d'un char.


10
2018-02-16 12:07


origine


Réponses:


ToUppercase est un itérateur, car il peut y avoir plus d'une version majuscule de certains caractères Unicode car la version en majuscule du caractère peut être composée de plusieurs points de code, comme l'a souligné delnan dans les commentaires. Vous pouvez convertir cela en un vecteur de caractères:

c.to_uppercase().collect::<Vec<_>>();

Ensuite, vous devriez collecter ces caractères dans une chaîne, comme indiqué par ker.


10
2018-02-16 12:15



Explication

ToUppercase est un Iterator, cela peut donner plus d'un char. Cela est nécessaire, car certains caractères Unicode se composent de plusieurs "valeurs Unicode Scalar" char représente).

Un bon exemple sont les soi-disant ligatures. Essayez ceci par exemple (sur le terrain de jeu):

let fi_upper: Vec<_> = 'fi'.to_uppercase().collect();
println!("{:?}", fi_upper);   // prints: ['F', 'I']

La ligature est un caractère unique dont la version en majuscule se compose de deux lettres / caractères.


Solution

Il y a plusieurs possibilités pour gérer cela:

  1. Travailler sur &str: si vos données sont réellement sous forme de chaîne, utilisez str::to_uppercase qui renvoie un String qui est plus facile à travailler.
  2. Utiliser les méthodes ASCII: si vous êtes sûr que vos données sont uniquement en ASCII et / ou que vous ne vous souciez pas des symboles Unicode, vous pouvez utiliser std::ascii::AsciiExt::to_ascii_uppercase qui retourne juste un char. Mais cela ne change que les lettres 'a' à 'z' et ignore tous les autres personnages!
  3. Traitez-le manuellement: Recueillir dans un String ou Vec comme dans l'exemple ci-dessus.

16
2018-02-16 21:01