2016-07-12 4 views
1

Je viens de faire quelques tests réussis avec ICU en C/C++. J'ai besoin d'analyser différents fichiers CSV avec des encodages différents (peut-être UTF-8, UTF-16LE,), faire quelques modifications sur les données et enfin tout sortir en UTF-8 dans un fichier. C'est pourquoi mon choix est tombé pour ICU. La détection des jeux de caractères fonctionne généralement bien, la gestion des caractères et la conversion en UTF-8 aussi.C++ utilisant ICU et Nana GUI Library - Conversion de chaîne?

Maintenant, je voulais intégrer cette partie de la bibliothèque qui fait le chargement CSV, la manipulation et ainsi de suite avec une bibliothèque GUI, Nana. Nana semble utiliser std :: string et std :: wstring.

Comme ICU stocke toutes les données en interne sous la forme UTF-16, donc j'ai obtenu UChars ou UnicodeStrings lorsque je travaille avec ICU. Mais comment pourrais-je utiliser l'un ou l'autre avec Nana, qui ne s'intègre pas avec ICU? Un moyen de transformer les tableaux UChar en wstring, ou un UnicodeString en wstring?

Vous n'avez trouvé aucun indice dans la documentation de l'ICU, alors ... peut-être que quelqu'un d'autre a déjà travaillé dessus?

Répondre

1

La plupart des fonctions nana attendent std::string codé en UTF-8.

Vous pouvez utiliser le ICU functions qui prend ou retourne char * pour effectuer la conversion en UTF-8.

Quelques-unes des fonctions de NANA comme widget::caption ont des surcharges pour std::wstring devrait être encodées en UTF-16 (sous Windows) ou UTF-32 (sous Linux) qui pourrait être utilisé pour passer à l'OS ce qui pourrait être la chaîne avec le type de caractère natif et l'encodage. Si vous avez besoin de conversions, nana propose nana::charset qui peut gérer (explicitement ou implicitement) certaines des conversions les plus fréquentes de/vers UTF-8/UTF-16/UTF-32.

Si vous expérimentez en passant le static_cast<wchar_t *>(some_UChar*) à nana, veuillez nous indiquer le résultat. Je ne peux pas tester.

La documentation sur le traitement Unicode nana besoin urgent d'être mis à jour (mea culpa)

+0

Bonjour à tous! Je vais tester ces fonctions de l'ICU bien sûr. Je viens de trouver des fonctions de ICU comme 'u_strToWCS' qui permet de convertir l'UChar * en un wchar_t *, donc je suis presque sûr que cela fonctionne. Je ferai aussi des expériences avec static_cast et je vous dirai ce qui se passe. Mon attente est que cela va bien fonctionner sur Windows, mais sur la plate-forme Unix/Linux ... – inzanez

+0

vous devrez peut-être ajouter un terminal 0 à votre chaîne UChar *? – qPCR4vir

+0

Cela dépend.Habituellement, lorsque vous travaillez avec des fonctions de manipulation de chaînes dans ICU, il est ajouté par la fonction (comme u_sprintf ou similaire). Sinon oui, vous devrez l'ajouter vous-même. – inzanez

0

Selon la documentation de l'ICU, un tableau UChar est un tableau de caractères larges de 16 bits ... ce qui signifie un tableau wchar_t dans les implémentations courantes. Cela signifie que si wchar_t a une largeur de 16 bits dans votre système, vous pouvez transtyper le résultat de la fonction getTerminatedBuffer() en const wchar_t * et l'utiliser directement comme chaîne de caractères de charriage C ou l'utiliser pour créer un std::wstring.

+0

Ce n'est pas vrai w.r.t. aliasing strict, sauf si vous vous assurez que 'UChar' est' wchar_t'. –

+0

Si UChar et wchar_t sont tous les deux des types entiers de même taille, ils sont du même type (seul le signe peut causer des problèmes) –

+0

C'est vrai en C mais pas en C++. En C++, 'wchar_t' est son propre type, pas un typedef. –