Bibliothèque standard C++ <codecvt>

<codecvt>C'est un fichier d'en-tête de la bibliothèque standard C++ qui fournit des outils pour la conversion de caractères. Ce fichier d'en-tête comprend principalementstd::codecvtmodèles de classe et leurs spécialisations, prenant en charge les conversions entre encodages de caractères, telles que de UTF-8 à UTF-16, ou à partir de caractères larges (wchar_t) vers un caractère étroit (char), etc.std::codecvtLa classe est généralement associée àstd::wstring_convertclasse ensemble pour réaliser la conversion d'encodage des caractères.

Syntaxe

codecvtLes principales classes et fonctions de l'espace de noms sont les suivantes:

  • codecvt_base: définit le type d'état et les méthodes de gestion des erreurs pour la conversion d'encodage.
  • codecvt_byname: une classe modèle utilisée pour créer des convertisseurs pour des encodages spécifiques.
  • codecvt_utf8、codecvt_utf16: classe de conversion pour des encodages spécifiques.

Syntaxe de base

#include <codecvt>
#include <locale>
#include <string>

std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::wstring wide_string = converter.from_bytes("Hello, World!");
std::string narrow_string = converter.to_bytes(L"你好,世界!");

Exemple

Exemple 1: Conversion d'UTF-8 en UTF-16

Dans cet exemple, nous allons montrer comment utilisercodecvtpour convertir une chaîne encodée en UTF-8 en une chaîne large encodée en UTF-16.

Exemple

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

int main() {
    // Créer un convertisseur UTF-8 vers UTF-16
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;

    // Chaîne UTF-8 d'origine
    std::string narrow_string = "Bonjour le monde !";

    // Convertir en chaîne large UTF-16
    std::wstring wide_string = converter.from_bytes(narrow_string);

    // Afficher la chaîne large
    std::wcout << L"Chaîne large : " << wide_string << std::endl;

    // Reconvertir la chaîne large en chaîne UTF-8
    std::string converted_string = converter.to_bytes(wide_string);

    // Afficher la chaîne convertie
    std::cout << "Chaîne convertie : " << converted_string << std::endl;

    return 0;
}

Résultat de sortie :

Wide string: Hello, World!
Converted string: Hello, World!

Exemple 2 : Conversion d'encodage avec codecvt_byname

Dans cet exemple, nous allons montrer comment utilisercodecvt_bynameclasse pour créer un convertisseur d'encodage basé sur un nom et l'utiliser pour la conversion.

Exemple

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

int main() {
    // Créer un convertisseur basé sur un nom ; ici "zh_CN.UTF-8" représente l'encodage UTF-8 pour le chinois simplifié
    std::wstring_convert<std::codecvt_byname<wchar_t>> converter("zh_CN.UTF-8");

    // Chaîne UTF-8 d'origine
    std::string narrow_string = "Bonjour, le monde !";

    // Convertir en chaîne large
    std::wstring wide_string = converter.from_bytes(narrow_string);

    // Afficher la chaîne large
    std::wcout << L"Chaîne large : " << wide_string << std::endl;

    // Reconvertir la chaîne large en chaîne UTF-8
    std::string converted_string = converter.to_bytes(wide_string);

    // Afficher la chaîne convertie
    std::cout << "Chaîne convertie : " << converted_string << std::endl;

    return 0;
}

Résultat de sortie :

Wide string: 你好,世界!
Converted string: 你好,世界!

std::codecvtSpécialisation de modèle de classe

std::codecvtIl existe plusieurs versions de spécialisation pour différentes conversions d'encodage de caractères :

  • std::codecvt_utf8<wchar_t>: caractère large (wchar_t) et UTF-8.
  • std::codecvt_utf8_utf16<char16_t>: Conversion entre UTF-8 et UTF-16.
  • std::codecvt_utf8<char32_t>: Conversion entre UTF-8 et UTF-32.

std::wstring_convertmodèle de classe

std::wstring_convertLe modèle de classe est une classe auxiliaire utilisée pour gérer le cycle de vie et la gestion des exceptions de la conversion d'encodage des caractères :

  • to_bytes: convertit des caractères larges ou des chaînes dans d'autres encodages en caractères étroits (séquences d'octets).
  • from_bytes: convertit des caractères étroits (séquences d'octets) en caractères larges ou en chaînes dans d'autres encodages.

Notes

  • Dans la norme C++17std::codecvta été déprécié, et il est recommandé d'utiliser des solutions alternatives (comme la bibliothèque ICU) pour la conversion d'encodage de caractères à l'avenir.
  • Pour les applications multiplateformes, un soin particulier doit être apporté à la gestion de l'encodage des caractères afin de garantir un comportement cohérent sur toutes les plateformes.

Résumé

<codecvt>Il fournit un ensemble puissant d'outils pour la conversion entre différents encodages de caractères, en particulier parmi UTF-8, UTF-16 et les caractères larges. Bien que déprécié en C++17, il reste un outil utile lors de la gestion de la conversion d'encodage de caractères. Comprendre et maîtriser l'utilisation de ces outils peut vous aider à écrire des applications plus flexibles et internationalisées. Si vous avez des exigences d'utilisation spécifiques ou des questions, vous pouvez en discuter davantage.

autres extensions