Question

Existe-t-il un wchar_t portable en C ++? Sous Windows, ses 2 octets. Sur tout le reste est 4 octets. Je voudrais utiliser wstring dans mon application, mais cela posera des problèmes si je décide en aval de le porter.

Était-ce utile?

La solution

Si vous avez affaire à une utilisation interne au programme, ne vous en faites pas; wchar_t en classe A est identique à en classe B.

Si vous envisagez de transférer des données entre des versions Windows et Linux / MacOSX, vous devez vous inquiéter de plus de wchar_t et vous devez trouver un moyen de gérer tous les détails.

Vous pouvez définir un type que vous définissez comme étant quatre octets partout, et implémenter vos propres chaînes, etc. (la plupart du traitement du texte en C ++ étant basé sur des modèles), mais je ne sais pas à quel point cela fonctionnerait. vos besoins.

Quelque chose comme typedef int my_char; typedef std::basic_string<my_char> my_string;

Autres conseils

Qu'entendez-vous par & "portable wchar_t &"? Il existe un type uint16_t de 16 bits de large partout, qui est souvent disponible. Mais bien sûr, cela ne constitue pas encore une chaîne. Une chaîne doit connaître son codage pour donner un sens à des fonctions telles que length(), substring() etc. (afin de ne pas couper les caractères au milieu d'un point de code lors de l'utilisation de utf8 ou 16). Je connais des classes de chaînes compatibles avec l'unicode que vous pouvez utiliser. Tous peuvent être utilisés gratuitement dans des programmes commerciaux (Qt one sera compatible avec les programmes commerciaux gratuitement dans quelques mois, à la sortie de Qt 4.5).

ustring à partir du gtkmm projet. Si vous programmez avec gtkmm ou utilisez glibmm, cela devrait être le premier choix, il utilise utf-8 en interne. Qt possède également une classe de chaîne, appelée QString. C'est encodé dans utf-16. ICU est un autre projet qui crée des classes de chaîne unicode portables et possède une UnicodeString classe qui en interne semble être encodé en utf-16, comme Qt. Je n'ai pas utilisé celui-là cependant.

Le standard C ++ 0x proposé aura les 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 le standard, vous devrez vous spécialiser char_traits pour les types entiers. Mais sur Visual Studio 2005, je me suis débrouillé avec std::basic_string<CHAR32> sans manipulation particulière.

  

Je prévois d'utiliser une base de données SQLite.

Ensuite, vous devrez utiliser UTF-16, pas <=>.

L'API SQLite a également une version UTF-8. Vous voudrez peut-être utiliser cela au lieu de traiter les <=> différences.

Ma suggestion. Utilisez UTF-8 et std :: string. Les chaînes larges ne vous apporteraient pas trop de valeur ajoutée. De toute façon, vous ne pouvez pas interpréter les caractères larges comme des lettres, car certains caractères sont créés à partir de plusieurs points de code Unicode.

Utilisez donc n'importe où UTF-8 et utilisez une bonne bibliothèque pour gérer les langages naturels. 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 ce dernier, vous ne pouvez pas créer, par exemple, stringstream basé sur ce caractère, car vous ne pourriez pas l'écrire.

Par exemple, cela ne fonctionnerait pas:

std::basic_ostringstream<unsigned> s;
ss << 10;

Ne vous créera pas de chaîne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top