Wie konvertiert man eine Zeichenkette in C++ in Kleinbuchstaben

Jinku Hu 11 Dezember 2023
Wie konvertiert man eine Zeichenkette in C++ in Kleinbuchstaben

In diesem Artikel stellen wir vor, wie Zeichenkette in C++ in Kleinbuchstaben konvertiert werden kann.

Das erste, was Sie sich fragen sollten, bevor Sie die Zeichenkettenkonvertierung in C++ durchführen, ist, welche Art von Codierung meine EingabeZeichenkette hat? Denn wenn Sie std::lower mit Multi-Byte-Kodierungszeichen verwenden, dann würden Sie auf jeden Fall fehlerhaften Code erhalten.

Selbst wenn die folgende Funktion eine saubere Implementierung der std::string Kleinbuchstaben-Konvertierung zu sein scheint, aber sie konvertiert nicht alle Zeichen in die Kleinbuchstaben, weil ihre Kodierung UTF-8 ist.

#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;
}

Der obige Code funktioniert gut für die ASCII-Zeichenketten und einige andere Nicht-ASCII-Zeichenketten, aber sobald Sie ihm eine etwas ungewöhnliche Eingabe geben, sagen wir einige lateinische Symbole darin, wäre die Ausgabe nicht zufriedenstellend.

Die Ausgabe:

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

Es ist falsch, da es das Symbol Å auf å hätte herabsetzen müssen. Wie können wir also dieses Problem lösen, um die korrekte Ausgabe zu erhalten?

Der beste tragbare Weg, dies zu erreichen, ist die Verwendung der ICU (International Components for Unicode) Bibliothek, die ausgereift genug ist, um Stabilität zu bieten, allgemein zugänglich ist und Ihren Code plattformübergreifend hält.

Wir brauchen nur die folgenden Header in unsere Quelldatei aufzunehmen. Es besteht eine gute Chance, dass diese Bibliotheken bereits enthalten und auf Ihrer Plattform verfügbar sind, so dass die Code-Beispiele gut funktionieren sollten. Wenn Sie jedoch IDE-/Kompilierungszeit-Fehler erhalten, lesen Sie bitte die Anweisungen zum Herunterladen der Bibliothek in ICU-Dokumentationswebsite.

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

Nun, da wir Header eingefügt haben, können wir std::string wie folgt in Kleinbuchstaben in den Konvertierungscode schreiben:

#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;
}

Beachten Sie, dass wir diesen Code mit den folgenden Compiler-Flags kompilieren sollten, um ICU-Bibliotheksabhängigkeiten einzubeziehen:

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

Lassen Sie den Code laufen, und wir erhalten die korrekte Ausgabe wie erwartet:

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

Dieselbe Funktion kann eine andere Sprache verarbeiten, die wir normalerweise nicht als Benutzereingabe erwarten, und wir können auch explizit das Gebietsschema als Parameter für die Funktion toLower angeben:

#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;
}
Autor: 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

Verwandter Artikel - C++ String