Strings konvertieren

C++-Programme sollen ja auch international in verschiedenen Sprachen und Kulturen eingesetzt werden. Dafür kann beispielsweise die Konvertierung von Zeichensätze notwendig sein. Gut, dass C++ da passende Schnittstellen bietet.

Video

Quellcode

#include <iostream>
#include <locale>
#include <codecvt>

using namespace std;

int main()
{
    u16string s { u"Ein kleiner Test äöü \u266B" };
    wstring_convert<codecvt_utf8<char16_t>, char16_t> converter;
    string cs { converter.to_bytes(s) };
    
    std::cout << cs << std::endl;
}

Erklärung

Der C++-Standard bietet eine ganze Reihe von Funktionen an, um Programme für den internationalen Einsatz fit zu machen. Eins davon: die Konvertierung zwischen verschiedenen Zeichensätzen. Diese Fähigkeit ist (wie alles andere, was für eine bestimmte Sprache/Umgebung relevant ist) in einer Facette gekapselt, in diesem Fall: std::codecvt. Von diesem Template abgeleitet ist die hier im Beispiel verwendete codecvt_utf8, die die Konvertierung von und zu UTF-8 erledigt. Die Schnittstelle der codecvt ist eigentlich auf einen anderen Anwendungsfall ausgelegt (meist sind die in irgendwelchen iostreams verpackt, aber dazu ein andermal mehr), so dass wir noch ein Objekt außenrum bauen, um die Konvertierung bequem erledigen zu können. Dieses Objekt ist std::wstring_convert. Es übernimmt die Ansteuerung der codecvt und bietet die Schnittstellen, um die Konvertierung bequem mit einem Aufruf zu erledigen (to_string() in Zeile 11). Im Beispiel oben konvertieren wir von einem char16_t-String in einen UTF-8-String, den wir dann auf std::cout ausgeben können (wo wir, so die Konsole das unterstützt, die richtigen Zeichen zu sehen bekommen).