web-dev-qa-db-fra.com

En-tête obsolète <codecvt> remplacement

Un peu au premier plan: ma tâche a nécessité la conversion du fichier XML UTF-8 en UTF-16 (avec un en-tête approprié, bien sûr). Et j’ai donc cherché les moyens habituels de convertir UTF-8 en UTF-16, et j’ai découvert qu’il fallait utiliser des modèles de <codecvt>.

Mais maintenant, quand il est obsolète , je me demande quelle est la nouvelle façon courante de faire la même chose?

(Cela ne vous dérange pas d'utiliser Boost, mais à part cela, je préfère rester aussi proche que possible de la bibliothèque standard.)

48
login_not_failed

std::codecvt modèle de <locale> lui-même n'est pas obsolète. Pour UTF-8 à UTF-16, il y a toujours std::codecvt<char16_t, char, std::mbstate_t> spécialisation.

Cependant, depuis std::wstring_convert et std::wbuffer_convert sont obsolètes avec les facettes de conversion standard, il n’existe pas de moyen facile de convertir des chaînes en utilisant les facettes.

Ainsi, comme Bolas l'a déjà répondu: implémentez-le vous-même (ou vous pouvez utiliser une bibliothèque tierce, comme toujours) ou continuez à utiliser l'API obsolète.

18
eerorika

Ne vous inquiétez pas pour ça.

Selon même source d'information :

cette composante de bibliothèque doit être retirée de l’Annexe D, aux côtés de jusqu’à ce qu’un remplacement approprié soit normalisé .

Vous pouvez donc toujours l'utiliser jusqu'à ce qu'une nouvelle version normalisée et plus sécurisée soit créée.

23
xmllmx

La nouvelle façon est ... vous l'écrivez vous-même. Ou tout simplement compter sur des fonctionnalités obsolètes. Espérons que le comité de normalisation ne va pas réellement enlever codecvt tant qu'il n'y aura pas de remplaçant fonctionnel.

Mais à l'heure actuelle, il n'y en a pas.

4
Nicol Bolas