web-dev-qa-db-fra.com

À propos de l'option «Jeu ​​de caractères» dans Visual Studio

J'ai une question sur l'option "Jeu de caractères" dans Visual Studio. Les options du jeu de caractères sont les suivantes:

  • Pas encore défini
  • Utiliser le jeu de caractères Unicode
  • Utiliser un jeu de caractères multi-octets

Je veux savoir quelle est la différence entre trois options dans le jeu de caractères?

De plus, si je choisis quelque chose, cela affectera-t-il la prise en charge des langues autres que l'anglais (comme les langues RTL)?

27
Lion King

Il s'agit d'un paramètre de compatibilité, destiné au code hérité qui a été écrit pour les anciennes versions de Windows qui n'étaient pas activées pour Unicode. Versions de la famille Windows 9x, Windows ME était la dernière et largement ignorée. Lorsque "Non défini" ou "Utiliser un jeu de caractères multi-octets" est sélectionné, toutes les fonctions de l'API Windows qui prennent une chaîne en argument sont redéfinies en une petite fonction d'aide à la compatibilité qui traduit les chaînes char* En wchar_t* strings, le type de chaîne natif de l'API.

Un tel code dépend de manière critique du paramètre de page de codes système par défaut. La page de codes mappe les caractères 8 bits à Unicode qui sélectionne le glyphe de police. Votre programme ne produira un texte correct que lorsque la machine qui exécute votre code a la page de codes correcte. Les caractères dont la valeur> = 128 seront rendus incorrects si la page de codes ne correspond pas.

Sélectionnez toujours "Utiliser le jeu de caractères Unicode" pour le code moderne. Surtout lorsque vous souhaitez prendre en charge des langues avec une disposition de droite à gauche et que vous n'avez pas de page de codes arabe ou hébreu sélectionnée sur votre machine de développement. Utilisez std::wstring Ou wchar_t[] Dans votre code. Pour obtenir une disposition RTL réelle, vous devez activer l'indicateur de style WS_EX_RTLREADING Dans l'appel CreateWindowEx().

27
Hans Passant

Hans a déjà répondu à la question, mais j'ai trouvé que ces paramètres avaient des noms curieux. (Qu'est-ce qui n'est pas exactement défini, et pourquoi les deux autres options semblent-elles si similaires?)

  • "Unicode" est ici le langage Microsoft pour le codage CS-2 en particulier. Il s'agit de la recommandation et non dépendant de la page de code décrite par Hans. Il existe un indicateur C++ #define correspondant appelé _UNICODE.
  • "Multi-Byte Character Set" (alias MBCS) ici la phrase officielle de Microsoft pour décrire leur ancien schéma international de codage de texte. Comme Hans l'a décrit, il existe différentes pages de codes MBCS décrivant différents langages. Les codages sont "multi-octets" en ce que certains ou tous les caractères peuvent être représentés par plusieurs octets. (Certaines pages de code utilisent un codage de longueur variable semblable à UTF-8.) Votre page de code typique représentera toujours tous les caractères ASCII en octet chacun. Il existe un indicateur C++ #define correspondant appelé _MBCS
  • "Non défini" fait apparemment référence à la compilation avec_UNICODE ni _MBCS étant # défini. Dans ce cas, Windows fonctionne avec un codage strict d'un octet par caractère. (Encore une fois, plusieurs pages de codes différentes sont disponibles dans ce cas.)

Différence entre MBCS et UTF-8 sous Windows aborde ces problèmes de manière beaucoup plus détaillée.

12
Chris