9
votes

Y a-t-il une fonction intégrée qui convertissait WSTRING ou WCHAR_T * en UTF-8 sous Linux?

Je souhaite convertir wstring en codage UTF-8, mais je veux utiliser des fonctions intégrées de Linux.

y a-t-il une fonction intégrée convertie wstring code> ou ou wchar_t * code> à utf-8 sous Linux avec une invocation simple forte>? p>

Exemple: P>

wstring str = L"file_name.txt";
wstring mode = "a";
fopen([FUNCTION](str), [FUNCTION](mode)); // Simple invoke.
cout << [FUNCTION](str); // Simple invoke.


4 commentaires

Quel codage supposez-vous pour wstring?


Si vous utilisez STD :: String et imprimez-le sur la console, le terminal Linux (au moins sur Ubuntu), interpréter par défaut comme UTF-8.


@Darcy: Eh bien, cela est vrai si les paramètres régionaux actuels sont UTF-8, qui correspond à la défaillance des distributions Linux la plupart des dernières années, mais ce n'est pas garanti.


@DavidHeffernan: std :: wstring sur Linux est toujours utf-32 n'est-ce pas?


4 Réponses :


-1
votes

Certainement, il n'y a pas de fonction intégrée sur Linux, car le nom Linux fait référence au noyau uniquement, ce qui n'a rien à aigu. Je doute sérieusement que le libc fourni avec GCC a une telle fonction et xxx

soutient cette théorie. Mais il y a beaucoup de bonnes bibliothèques UTF-8 autour. Je recommande personnellement la bibliothèque iconv pour de telles conversions.


1 commentaires

Votre recherche de votre homme vous repose: Linux glibc a une implémentation Iconv: gnu.org/s/hello/manual/libc/glibc-iconv-implementation.html



1
votes

Il est tout à fait plausible que WCSTOMBS fera savoir ce dont vous avez besoin si ce que vous voulez réellement faire est de convertir des caractères de large à la locale actuelle.

Sinon, vous n'avez probablement pas besoin de regarder l'ICU, booster ou similaire.


2 commentaires

WCSTOMBS n'a aucune notion de codages spécifiques. Ce n'est pas la réponse.


WCSTOMBS devrait fonctionner si et uniquement si les paramètres régionaux actuels sont utf-8 .



8
votes

La norme de langue C ++ n'a aucune notion de codages explicites. Il ne contient qu'une notion opaque d'un "codage de système", pour laquelle wchar_t est un type "suffisamment grand".

Pour convertir du système opaque codant en un codage externe explicite, vous devez utiliser une bibliothèque externe. La bibliothèque de choix serait iconv () (à partir de wchar_t to utf-8 ), qui fait partie de POSIX et disponible sur de nombreuses plates-formes, Bien que sur Windows, le widechartomultibyte fonctions est garantie de produire UTF8.

C ++ 11 ajoute de nouveaux littéraux sous forme de std :: string s = u8 "bonjour monde: \ u0010ffff"; . Celles-ci sont déjà dans UTF8, mais elles ne peuvent pas interfacer avec l'opaque wstring autre que dans la manière dont j'ai décrit.

Voir cette question pour un peu plus d'arrière-plan.


4 commentaires

Les chaînes UTF-8 de C ++ 11 peuvent interfacer avec Wtstrings via wstring_convert


@Cubbi: Je ne suis pas convaincu que cela a quelque chose à voir avec UTF8. Il ressemble à une simple wrapper pour wcstombbs . (Il y a un en-tête qui semble plus prometteur.)


wstring_convert n'est pas lié à wcstombs . C'est une enveloppe pour les facettes CODECVT, telles que codecvt_utf8 .


@KERReck SB: Je pense que je vois votre point de vue: À l'exception des fonctions SAFT Il n'y a pas de connexion portable entre les conversions génériques de C ++ 03 de C ++ 03 / larges de conversions et de larges de l'UTF-8 / UTF-16 de C ++ 11 / UTF-16LE / UCS2 / UTF-32 / UCS4 conversions. Observation intéressante.



15
votes

Si / Lorsque votre compilateur prend suffisamment de C ++ 11, vous pouvez utiliser wstring_convert xxx

testé avec clang ++ 2.9 / libc ++ sur Linux et Visual Studio 2010 sous Windows.


2 commentaires

STD :: wbuffer_convert, std :: wstring_convert et the en-tête (contenant STD :: codecvt_mode, std :: codecvt_utf8, std :: codecvt_utf16 et std :: codecvt_utf8_utf16) sont obsolètes en C ++ 17. (Le modèle de classe STD :: Codecvt n'est pas obsolète.)


@ A.DANESH C'était une dépréciation ambrénale, comme avec des stractes qui ont été obsolètes en C ++ 98, mais sont toujours une partie obligatoire de C ++ 20