Question

Je suis en train de réviser certains très vieux (10 ans) code C. Le code compile sous Unix / Mac avec GCC et croisées pour Windows avec compiles MinGW. Actuellement, il y a des chaînes TCHAR partout. Je voudrais vous débarrasser de l'TCHAR et utiliser un C ++ de chaîne. Est-il encore nécessaire d'utiliser les fonctions larges Windows, ou je peux tout faire maintenant avec Unicode et UTF-8?

Était-ce utile?

La solution

Windows utilise toujours UTF16 et très probablement toujours. Vous devez utiliser wstring plutôt que string donc. API Windows n'offrent pas de support pour UTF8 directement en grande partie parce que Windows Unicode pris en charge avant UTF8 a été inventé.

Il est donc assez pénible d'écrire du code Unicode qui compilera sur les deux plates-formes Windows et Unix.

Autres conseils

Est-il encore nécessaire d'utiliser la fonctions Windows larges, ou puis-je faire tout maintenant avec Unicode et UTF-8?

Oui. Malheureusement, Windows ne prend pas en charge native pour UTF-8. Si vous voulez le support Unicode approprié, vous devez utiliser la version wchar_t des fonctions API de Windows, pas la version char.

dois-je éliminer TCHAR à partir du code de Windows?

Oui, vous devriez. La raison existe TCHAR est de soutenir à la fois Unicode et les versions non-Unicode de Windows. soutien non Unicode peut-être un retour de préoccupation majeure en 2001 lorsque Windows 98 était encore populaire, mais pas aujourd'hui.

Et il est très peu probable que toute bibliothèque non spécifique Windows aurait le même genre de char / wchar_t surcharge qui fait TCHAR utilisable.

Alors allez-y et remplacer tous vos TCHARs avec wchar_ts.

Le code compile sous Unix / Mac avec GCC et croisées pour Windows avec compiles MinGW.

J'ai eu à écrire du code multi-plateforme C ++ avant. (Maintenant, mon travail est en train d'écrire un code multi-plateforme C #.) Le codage des caractères est assez pénible lorsque Windows ne prend pas en charge UTF-8 et Un * x ne UTF-16 prend pas en charge. Je fini par utiliser UTF-8 comme notre principal encodage et la conversion nécessaire sur Windows.

Oui, l'écriture d'applications non-unicode de nos jours est vous tirer une balle dans le pied. Il suffit d'utiliser l'API large partout, et vous aurez pas à pleurer à ce sujet plus tard. Vous pouvez toujours utiliser UTF8 sous UNIX et wchar_t sous Windows si vous n'avez pas besoin (réseau) entre les plates-formes de communication (ou convertir de l'API Win32 pour l'UTF8 wchar_t), ou aller partout à la dure et l'utilisation UTF8 et convertir wchar_t est lorsque vous utilisez les fonctions API Win32 (c'est ce que je fais).

To directly answer your question:

Is it still necessary to use the Windows wide functions, or can I do everything now with Unicode and UTF-8?

No, (non-ASCII) UTF-8 is not accepted by the vast majority of Windows API functions. You still have to use the wide APIs.

One could similarly bemoan that other OSes still have no support for wchar_t. So you also have to support UTF-8.

The other answers provide some good advice on how to manage this in a cross-platform codebase, but it sounds as if you already have an implementation supporting different character types. As desirable as ripping that out to simplify the code might sound, don't.

And I predict that someday, although probably not before the year 2020, Windows will add UTF-8 support, simply by adding U versions of all the API functions, alongside A and W, plus the same kind of linker hack. The 8-bit A functions are just a translation layer over the native W (UTF-16) functions. I bet they could generate a U-layer semi-automatically from the A-layer.

Once they've been teased enough, long enough, about their '20th century' Unicode support...

They'll still manage to make it awkward to write, ugly to read and non-portable by default, by using carefully chosen macros and default Visual Studio settings.

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