2010-05-07 23 views
3

lors du portage de mon projet Visual C++ GCC, je trouve que le wchar_t type_données UTF-32 par défaut de 4 octets. Je pourrais surcharger cela avec une option de compilateur, mais alors toute la partie wcs * (wcslen, wcscmp, etc.) de RTL est rendue inutilisable, car elle suppose des chaînes de 4 octets. Pour l'instant, j'ai réimplémenté 5-6 de ces fonctions à partir de zéro et # défini mes implémentations. Mais y at-il une option plus élégante - disons, une construction de GCC RTL avec 2-byte wchar-t tranquillement assis quelque part, en attente d'être lié?2 octets (UCS-2) les chaînes étendues sous GCC

Les saveurs spécifiques du CCG je suis après sont Xcode sous Mac OS X, Cygwin, et celui qui est livré avec Debian Linux Etch.

Répondre

0

Réimplémentée 5-6 de WCS plus communs * fonctions, #defined mes mises en œuvre dans.

1

Regardez le ICU library. C'est une bibliothèque portable avec une API UTF-16.

+0

Réécriture tout mon code large chaîne MSVC est pas ce que je cherche, désolé. Je veux une compatibilité avec la source UCS-2 RTL. –

+1

* hausser les épaules * mon employeur vend une telle bibliothèque. Je suis raisonnablement sûr que l'ICU est l'alternative libre la plus proche. – bmargulies

1

Comme vous l'avez remarqué, wchar_t est défini par l'implémentation. Il n'y a aucun moyen de travailler avec ce type de données.

Les systèmes Linux en général avaient l'avantage d'obtenir un support Unicode plus tard, après que toute la débâcle d'UCS-2 ait été déclarée une idée pas si géniale, et d'utiliser UTF-8 comme encodage. Toutes les API système fonctionnent toujours sur char * et sont sécurisées par Unicode.

Vos meilleurs paris sont d'utiliser une bibliothèque qui gère pour vous: Qt, soins intensifs, etc.

Notez que Cygwin dispose d'un wchar_t 2 octets pour faire engrener avec Windows plus facile.

2

Mais est-il une option plus élégante - dire, une version de GCC RTL avec wchar-t 2 octets tranquillement assis quelque part, en attente d'être lié?

Non. Il s'agit d'un problème spécifique à la plate-forme et non d'un problème GCC. C'est-à-dire que la plate-forme Linux ABI spécifie que wchar_t a une largeur de 32 bits, donc soit vous devez utiliser une toute nouvelle bibliothèque (pour laquelle ICU est un choix populaire), soit porter votre code pour gérer 4- octet wchar_t s. Toutes les bibliothèques que vous pourriez créer un lien vers assumeront également 4 octets wchar_t et sera pause si vous utilisez GCC -fshort-wchar.

Mais sur Linux en particulier, presque tout le monde a standardisé UTF-8 pour tous les encodages multi-octets.

+0

Point pris. Pour l'enregistrement, tout traitement de chaîne non triviale en UTF-8 aspire les sacs en plastique. Iterating au caractère i'th (pas octet) dans la chaîne est une opération O (i), oh mon. –

+0

Mais c'est l'environnement local qui est configuré sur presque tous les systèmes Linux ces jours-ci, donc c'est quelque chose que vous devez gérer. – greyfade

+3

@Steva: UTF-16 a le même problème. Ne confondez pas UCS-2 (pré Win2k) avec UTF-16 (Win2k +). –