Portable wchar_t en C ++

Existe-t-il un wchar_t portable en C ++? Sous Windows, ses 2 octets. Sur tout le rest, il y a 4 octets. Je voudrais utiliser wssortingng dans mon application, mais cela posera des problèmes si je décide de le transférer ultérieurement.

Si vous avez affaire à une utilisation interne au programme, ne vous en faites pas. un wchar_t en classe A est le même que dans la classe B.

Si vous prévoyez de transférer des données entre les versions Windows et Linux / MacOSX, vous avez plus à vous soucier de wchar_t, et vous devez trouver des moyens de gérer tous les détails.

Vous pouvez définir un type que vous définissez comme étant de quatre octets partout, et implémenter vos propres chaînes, etc.

Quelque chose comme typedef int my_char; typedef std::basic_ssortingng my_ssortingng; typedef int my_char; typedef std::basic_ssortingng my_ssortingng;

Que voulez-vous dire par “portable wchar_t”? Il y a un type uint16_t large partout, souvent disponible. Mais bien sûr, cela ne constitue pas encore une chaîne. Une chaîne doit connaître son encodage pour donner un sens aux fonctions telles que length() , subssortingng() , etc. Il existe des classes de chaînes compatibles Unicode que je connais et que vous pouvez utiliser. Tous peuvent être utilisés gratuitement dans des programmes commerciaux (le Qt One sera compatible avec les programmes commerciaux gratuits dans quelques mois, lorsque Qt 4.5 sera disponible).

ussortingng du projet gtkmm . Si vous programmez avec gtkmm ou utilisez glibmm, cela devrait être le premier choix, il utilise utf-8 interne. Qt également une classe de chaînes, appelée QSsortingng. Il est encodé en utf-16 . ICU est un autre projet qui crée des classes de chaînes portables Unicode et possède une classe UnicodeSsortingng qui semble être codée en interne dans utf-16, comme Qt. N’a pas utilisé celui-là cependant.

Le standard C ++ 0x char16_t char32_t types char16_t et char32_t . Jusque-là, vous devrez utiliser des entiers pour le type de caractère non wchar_t .

 #if defined(__STDC_ISO_10646__) #define WCHAR_IS_UTF32 #elif defined(_WIN32) || defined(_WIN64) #define WCHAR_IS_UTF16 #endif #if defined(__STDC_UTF_16__) typedef _Char16_t CHAR16; #elif defined(WCHAR_IS_UTF16) typedef wchar_t CHAR16; #else typedef uint16_t CHAR16; #endif #if defined(__STDC_UTF_32__) typedef _Char32_t CHAR32; #elif defined(WCHAR_IS_UTF32) typedef wchar_t CHAR32; #else typedef uint32_t CHAR32; #endif 

Selon la norme, vous devrez spécialiser char_traits pour les types entiers. Mais sur Visual Studio 2005, je me suis std::basic_ssortingng avec std::basic_ssortingng sans traitement spécial.

Je prévois d’utiliser une firebase database SQLite.

Ensuite, vous devrez utiliser UTF-16, pas wchar_t .

L’API SQLite dispose également d’une version UTF-8. Vous voudrez peut-être l’utiliser au lieu de traiter les différences wchar_t .

Ma suggestion. Utilisez UTF-8 et std :: ssortingng. Les chaînes larges ne vous apporteraient pas trop de valeur ajoutée. Comme vous ne pouvez de toute façon pas interpréter le caractère large en tant que lettre, certains caractères créés à partir de plusieurs points de code Unicode.

Utilisez donc n’importe où UTF-8 et utilisez une bonne bibliothèque pour traiter les langues naturelles. Comme par exemple Boost.Locale.

Mauvaise idée: définir quelque chose comme typedef uint32_t mychar; est mauvais. Comme vous ne pouvez pas utiliser iostream avec lui, vous ne pouvez pas créer par exemple ssortingngstream basé sur ce caractère car vous ne pourriez pas y écrire.

Par exemple, cela ne fonctionnerait pas:

 std::basic_ossortingngstream s; ss << 10; 

Ne vous créerait pas de chaîne.