Comment convertir une chaîne de caractères en minuscules en C++

Jinku Hu 11 décembre 2023
Comment convertir une chaîne de caractères en minuscules en C++

Dans cet article, nous introduirons la manière de convertir une chaîne de caractères en minuscules en C++.

La première chose à se demander avant de procéder à la conversion d’une chaîne en C++ est de savoir quel est le type de codage de ma chaîne d’entrée. Car si vous utilisez std::lower avec des caractères de codage sur plusieurs octets, vous obtiendrez certainement un code bogué.

Même si la fonction suivante semble une implémentation soignée de la conversion des minuscules de std::string, mais elle ne convertit pas tous les caractères en minuscules car son encodage est UTF-8.

#include <algorithm>
#include <iostream>

std::string toLower(std::string s) {
  std::transform(s.begin(), s.end(), s.begin(),
                 [](unsigned char c) { return std::tolower(c); });
  return s;
}

int main() {
  std::string string1 = u8"ÅSH to LoWer WÅN";
  std::cout << "input string:  " << string1 << std::endl
            << "output string: " << toLower(string1) << std::endl;
  return 0;
}

Le code ci-dessus fonctionne bien pour les chaînes ASCII et certaines autres chaînes non-ASCII également, mais une fois que vous lui donnez une entrée un peu inhabituelle, disons quelques symboles latins, la sortie ne serait pas satisfaisante.

Production:

input string:  ÅSH to LoWer WÅN
output string: Åsh to lower wÅn

Il est incorrect, car il aurait dû abaisser le symbole Å à å. Alors, comment pouvons-nous résoudre ce problème pour obtenir la sortie correcte ?

La meilleure façon de le faire est d’utiliser la bibliothèque ICU (International Components for Unicode), qui est suffisamment mature pour offrir une stabilité, largement accessible, et qui conservera votre code multiplateforme.

Il nous suffit d’inclure les en-têtes suivants dans notre fichier source. Il y a de fortes chances que ces bibliothèques soient déjà incluses et disponibles sur votre plateforme, donc les échantillons de code devraient fonctionner correctement. Mais si vous obtenez des erreurs d’EDI/compilation, veuillez consulter les instructions pour télécharger la bibliothèque dans site de documentation de l’ICU.

#include <unicode/locid.h>
#include <unicode/unistr.h>
#include <unicode/ustream.h>

Maintenant que nous avons inclus les en-têtes, nous pouvons écrire std::string en code de conversion minuscule comme suit:

#include <unicode/locid.h>
#include <unicode/unistr.h>
#include <unicode/ustream.h>

#include <iostream>

int main() {
  std::string string1 = u8"ÅSH to LoWer WÅN";
  icu::UnicodeString unicodeString(string1.c_str());
  std::cout << "input string:  " << string1 << std::endl
            << "output string: " << unicodeString.toLower() << std::endl;
  return 0;
}

Notez que nous devons compiler ce code avec les drapeaux de compilation suivants pour inclure les dépendances de la bibliothèque ICU:

g++ sample_code.cpp -licuio -licuuc -o sample_code

Exécutez le code, et nous obtenons la sortie correcte comme prévu:

input string:  ÅSH to LoWer WÅN
output string: åsh to lower wån

La même fonction peut traiter un langage différent que nous n’attendons généralement pas comme entrée de l’utilisateur, et nous pouvons également spécifier explicitement la locale comme paramètre de la fonction toLower:

#include <iostream>
#include <unicode/unistr.h>
#include <unicode/ustream.h>
#include <unicode/locid.h>

int main() {
    std::string string2 = "Κάδμῳ ἀπιϰόμενοι.. Ελληνας ϰαὶ δὴ ϰαὶ γράμματα, οὐϰ ἐόντα πρὶν Ελλησι";
    icu::UnicodeString unicodeString2(string2.c_str());
    std::cout  << unicodeString2.toLower("el_GR") << std::endl;
    return 0;
}
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Article connexe - C++ String