Je veux faire une application Win32 C ++ pouvant être jouée sur une version de codage (Unicode & ANSI). Maintenant, je suis un peu confus quant à la différence entre les deux (ou plus?) Encodings? P>
Pour faire mes applications Win32 Compatibilité croisée Compatible qui signifie que je dois passer par mon code et remplacer chaque STD :: String avec std :: wstring, puis remplacer chaque char em> avec un wchar_t * puis remplacer chaque chaîne littérale ("") avec L ""? P>
Que se passera-t-il si ma demande s'exécute sur une machine Unicode et mon application a une STD :: String dedans? STRUT> P>
Avez-vous des conseils sur les étapes que je dois prendre pour faire ma demande de codage croisée compatible?
Pour par exemple:
- Changez toutes les c_strings et les chaînes à leur équivalent unicode
- Modifiez toutes les fonctions WIN32 à la version incapable (par exemple, Changement de Getenv () à _wgetenv ()) P>
4 Réponses :
Vous pouvez utiliser TCHAR dans votre cas.
in Unicode, TCHAR est WURAR. Dans non unicode, TCHAR est char. P>
Si vous souhaitez utiliser STD :: String, je vous recommande l'utilisation suivante. P>
#ifdef UNICODE #define std::tstring str::wstring #else #define std::tstring str::string #endif
Merci pour les conseils :), mais ne définit pas le compilateur de compilation se rapportant à la prise de ces décisions à la compilation et à l'heure de l'exécution, donc si je compile sur mon ordinateur ansii et libérez cela .exe, il échouera toujours si je l'envoie à quelqu'un Russie?
Euh, #define std :: ttstring stdd :: wstring code> ne fait pas ce que vous pensez que ça fait.
@user - mais si vous le compilez avec unicode défini, cela fonctionnera partout. Pourquoi déranger avec deux versions?
Je suggérerais fortement de ne pas le faire, il suffit d'utiliser Unicode partout, qui devrait également être une utilisation (moderne C ++) ou une typlef pas #define pour TString
La dernière version de Windows qui n'a pas utilisé Unicode en interne était Windows Me. La recommandation du nouveau code est d'utiliser Unicode exclusivement. Une certaine conversion peut être nécessaire lorsque vous devez lire et écrire des fichiers codés avec une page de code spécifique. P>
Vous êtes sur la bonne voie avec vos pensées initiales. Si vous utilisez Microsoft's Csching, il s'agit de deux versions Cstringa et Cstringw - vous devez modifier une définition de compilateur et utilisera CStringw dans tous les endroits que vous spécifiez CSSTRING, et tout va simplement fonctionner. Vous devriez utiliser std :: wstring au lieu de std :: string. Préfixe chaque littéral de chaîne avec l "" code> ou utilisez Microsoft 'code> _t ("") code> qui convient à la même chose. P>
Que se passera-t-il si ma candidature s'exécute sur une machine Unicode et mon application a une STD :: String dedans? EM> STRY> P> P> P> P> P> P>
Les ordinateurs ne sont pas quelle est exactement la différence entre les deux (ou plus?) Encodings? em> strong> p> p>
Qu'est-ce que ASCII? em> strong> Qu'est-ce que Unicode? em> strong> Unicode est une tentative d'ISO et du consortium Unicode pour développer un système de codage pour le texte électronique qui inclut chaque alphabet écrit existant. Unicode utilise des caractères 8, 16 ou 32 bits en fonction de la représentation spécifique, de sorte que les documents Unicode nécessitent souvent jusqu'à deux fois plus d'espace disque que les documents ASCII ou Latin-1. Les 256 premiers caractères d'Unicode sont identiques à latin-1. P>
Dans Win32, Unicode est supporté par # Définir le Avez-vous des conseils sur les étapes que je dois prendre pour faire mon application croisée croisée compatible? em> strud> p> p>
Chaque fonction Win32 (qui prend ou retourne une chaîne) a deux variantes, une pour ASCII et une pour UNICODE. Et l'appel de la fonction se résout à l'un d'entre eux, selon que la macro Unicode soit définie ou non. Vous devez donc définir la macro et commencer à utiliser les versions Unicode des fonctions. Par exemple: p>
Remplacement de chaque Comme vous l'avez souligné, c'est une liste de choses que vous devrez prendre en charge, vous n'êtes pas la liste complète. p>
Fondamentalement, vous devrez utiliser toutes les versions Unicode des types et des appels de fonction dans votre code. P> ansi code> ou
Unicode code> mais les systèmes d'exploitation sur lesquels les ordinateurs fonctionnent sont. La dernière version de Windows qui n'a pas pris en charge Unicode était Windows 3.11 pour Workgroups. Si vous exécutez une application compilée ASCII sur un Unicode. P>
ASCII est une technique de codage de sept bits qui attribue un numéro à chacun des 128 caractères utilisés le plus souvent en anglais américain. Cela permet à la plupart des ordinateurs d'enregistrer et d'afficher du texte de base. ASCII n'inclut pas les symboles fréquemment utilisés dans d'autres pays. P>
Un tirage majeur à ASCII était que vous n'auriez que 256 personnages différents. Cependant, des langues telles que le japonais et l'arabe ont des milliers de personnages. Ainsi, ASCII ne fonctionnerait pas dans ces situations. Le résultat était Unicode qui a permis jusqu'à 65 536 caractères différents. p>
Unicode code> et
_unicode code> macros. Cela permet à son tour que votre programme utilise les variantes Unicode des fonctions WIN32. P>
std :: string code> avec
std :: wstring code>,
Remplacement de chaque char code> avec un
wchar_t * code>
Remplacement de chaque chaîne littéral ("") code> avec
l "" code>
Utilisation du support code> TCHAR code> sous Windows, etc. p>
Unicode permet environ 2 millions de caractères (2 ^ 21); Il a plusieurs "plans" de 65536 caractères chacun. Les caractères les plus courants sont tous dans le plan de base multilingue; C'est probablement là que vient la confusion.
Lorsque vous compilez un programme d'ANSI ou UNICODE, vous affectez deux choses.
créeefile () code>. L'API réelle appelée est soit Createfilea () Code> ou CreateFilew () Code> (ANSI ou Large (I.E. Unicode)) en fonction du réglage de votre compilateur. En interne, le NT Kernal utilise Unicde pour toutes les API. Les API ANSI convertissent simplement leurs paramètres de chaîne en ANSI et appellent les API UNICODE. De nombreuses API sont UNICOCODE UNIQUEMENT. LI>
- Comment
t * code> macros sont élargis. TCHAR code> sera éventuellement étendu à char code> au mode ANSI, wchar_t code> en mode UNICODE. LI>
ol> choses comme std :: string code> et std :: wstring code> ne sont pas affectés avant d'avoir besoin d'appeler une API et de leur donner une chaîne. . L'utilisation de chaîne code> vs. code> wstring code> doit être déterminée par les besoins de votre programme et non s'il est compilé ANSI ou UNICODE. P> Vous pouvez utiliser ATL pour facilement utiliser convertir des chaînes si nécessaire. p> xxx pré> ou, si vous préférez, vous pouvez utiliser A2T () code> et votre code fonctionnera s'il est compilé pour ANSI ou Unicode. p> p>
Vous pensez sérieusement à soutenir Windows 9X?
Je l'ai fait il y a 5 ans et même je ne me suis pas préoccupé par Ansi. MSLU (UNICOWS.DLL) fait 9x apparaître suffisamment de NT.
Ce qu'Alf a dit. Si vous faites autre chose que de soutenir l'unicode complet partout sur Win32, vous faites quelque chose de mal ou êtes dans une terrible situation de soutenir les systèmes d'exploitation au-delà de l'obsolète ...