Maison  >  Article  >  développement back-end  >  Comment convertir entre différents types de chaînes Unicode en C 11 ?

Comment convertir entre différents types de chaînes Unicode en C 11 ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-26 17:23:30466parcourir

How do you convert between different types of Unicode strings in C  11?

Méthodes de conversion de chaînes Unicode

La conversion entre différents types de chaînes Unicode peut être nécessaire dans divers scénarios de programmation. Cependant, la méthode existante consistant à utiliser mbstowcs() et wcstombs() a ses limites. Bien que ces méthodes effectuent des conversions entre les jeux de caractères multi-octets et les chaînes de caractères larges, elles ne fonctionnent pas nécessairement avec UTF-16 ou UTF-32, et elles dépendent de l'encodage wchar_t des paramètres régionaux.

Meilleures approches en C 11

C 11 a introduit plusieurs nouvelles options pour les conversions de chaînes Unicode, notamment :

1. std::wstring_convert

Cette classe de modèle fournit une interface pratique pour la conversion entre les chaînes. Il peut être utilisé avec différentes facettes de codecvt pour gérer diverses conversions, telles que UTF-8 en UTF-16 ou UTF-8 en UTF-32 :

<code class="cpp">std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> convert;
std::string utf8_string = u8"This string has UTF-8 content";
std::u16string utf16_string = convert.from_bytes(utf8_string);</code>

2. Nouvelles spécialisations Codecvt

C 11 a également introduit de nouvelles spécialisations codecvt plus faciles à utiliser :

<code class="cpp">std::codecvt_utf8_utf16<char16_t> // converts between UTF-8 and UTF-16
std::codecvt_utf8<char32_t> // converts between UTF-8 and UTF-32
std::codecvt_utf8<char16_t> // converts between UTF-8 and UCS-2</code>

Ces spécialisations peuvent être utilisées avec std::wstring_convert pour faciliter les conversions :

<code class="cpp">std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> convert16;
std::string a = convert16.to_bytes(u"This string has UTF-16 content");</code>

Remarque : Visual Studio 2010 peut rencontrer des problèmes lors de l'utilisation de ces spécialisations en raison des limitations de spécialisation des modèles avec les types typedef. Dans de tels cas, il est recommandé de définir une sous-classe de codecvt avec un destructeur ou d'utiliser la fonction de modèle std::use_facet.

3. Conversion entre UTF-32 et UTF-16

Étant donné que C 11 ne fournit pas de conversion directe entre UTF-32 et UTF-16, vous pouvez combiner deux instances de std::wstring_convert:

<code class="cpp">std::wstring_convert<std::codecvt_utf8_utf32<char32_t>, char32_t> convert32;
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> convert16;
std::u32string utf32_string = u"This string has UTF-32 content";
std::string utf8_string = convert32.to_bytes(utf32_string);
std::u16string utf16_string = convert16.from_bytes(utf8_string);</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn