API Windows: ANSI et chaînes de caractères larges-est-ce UTF8 ou ASCII? UTF-16 ou UCS-2 LE?

Je ne suis pas tout à fait pro avec les encodages, Mais voici ce que je pense savoir (bien que cela puisse être faux):

  1. ASCII est un encodage 7 bits de longueur fixe, avec les caractères que vous pouvez trouver dans les graphiques ASCII.
  2. UTF8 est un encodage 8 bits de longueur variable. Tous les caractères peuvent être écrits en UTF8.
  3. UCS - 2 LE / BE sont des encodages 16 bits de longueur fixe qui prennent en charge les caractères les plus courants.
  4. UTF-16 est un encodage 16 bits de longueur variable. Tous les caractères peuvent être écrits en UTF16.

Sont-ils avant tout corrects?

Maintenant, pour les questions:

  1. les fonctions Windows " A " (comme SetWindowTextA) prennent-elles des chaînes ASCII? Ou " chaînes multi-octets "(plus de questions à ce sujet ci-dessous)?
  2. les fonctions Windows "W" prennent-elles des chaînes UTF-16 ou des chaînes UCS-2? Je pensais qu'ils prenaient en UCS-2, mais les noms me confondent.
  3. dans WideCharToMultiByte , Microsoft utilise le mot "chaîne de caractères larges" pour signifier UTF-16. Dans ce contexte, alors quoi est considéré comme une "chaîne multi-octets"? UTF-8?
  4. Est LPWSTR "une chaîne de caractères larges"? Je dirais que c'est le cas, mais alors, cela ne voudrait-il pas dire que C'est UTF-16? Et cela ne voudrait-il pas dire qu'il pourrait être utilisé pour afficher, disons, des caractères de 4 octets? Si non, alors... affiche de 4 octets caractères impossible? (Windows ne semble pas avoir D'API pour ceux-ci.)
  5. Est la fonctionnalité de WideCharToMultiByte un sur-ensemble de celui de wcstombs, et ils travaillent tous les deux sur le même type de chaîne? Ou est-ce que l'on, disons, travaille sur UTF-16 tout en les autres travaux sur la NGC-2?
  6. Les chemins de fichiers sont-ils en UTF-16 ou UCS-2? Je sais que Windows le traite comme un "tableau opaque de caractères" de la documentation de Microsoft, mais selon la norme C pour des fonctions comme fwprintf, y a-t-il un encodage standardisé?
  7. Qu'est-ce que le codage" ANSI"? Est-ce même un terme correct? Et comment cela se rapporte-t-il à ASCII?
  8. (j'ai eu plus de questions, mais cela suffit... J'en ai oublié quelques-uns de toute façon...)

Ce sont beaucoup de questions, donc des liens vers des explications sur la façon dont tous ceux-ci se connectent (en dehors de la lecture de la norme Unicode, qui n'aidera pas avec L'API Windows de toute façon) seraient également grandement appréciées.

Merci!

31
demandé sur Mehrdad 2011-01-04 12:45:46

4 réponses

Sont-ils avant tout corrects?

Oui, si vous ne supposez pas l'existence de caractères non codés en Unicode (pour la plupart des applications pratiques, cette hypothèse est correcte).

Les fonctions Windows " A " (comme SetWindowTextA) prennent-elles des chaînes ASCII? Ou " chaînes multi-octets "(plus de questions à ce sujet ci-dessous)?

Ils prennent des chaînes d'octets (c'est-à-dire des chaînes dont l'Unité de code est un octet, qui est toujours un octet sous Windows) codées dans le courant "ANSI" /MBCS / encodage hérité. "ANSI" est les Termes historiques pour ces encodages, mais pas correct. Pour les systèmes Windows occidentaux, cet encodage est généralement Windows-1252.

Les fonctions Windows "W" prennent-elles des chaînes UTF-16 ou des chaînes UCS-2? Je pensais qu'ils prenaient en UCS-2, mais les noms me confondent.

Depuis Windows 2000, la plupart d'entre eux prennent en charge UTF-16. Le nom "wide" et le reste de la terminologie Microsoft (par exemple, "Unicode" signifiant "UTF-16" ou "UCS") ont été choisis avant la norme Unicode moderne a unifié la terminologie.

Dans WideCharToMultiByte, Microsoft utilise le mot "chaîne de caractères larges" pour signifier UTF-16. Dans ce contexte, qu'est-ce qui est considéré comme une "chaîne multi-octets"? UTF-8?

Tous les autres encodages pris en charge par WideCharToMultiByte sont un "encodage multi-octets" dans ce contexte, y compris Windows-1251 et UTF-8.

LPWSTR est-il une "chaîne de caractères larges"? Je dirais que c'est le cas, mais alors, cela ne voudrait-il pas dire que C'est UTF-16? Et ne le ferait pas cela signifie qu'il pourrait être utilisé pour afficher, disons, des caractères de 4 octets? Si non, alors... affiche de 4 octets caractères impossible? (Windows ne semble pas avoir D'API pour ceux-ci.)

LPWSTR est un pointeur vers wchar_t, qui est toujours un entier non signé 16 bits sur Windows. Les caractères qui peuvent être affichés ne sont pas liés à l'encodage tant que cet encodage peut encoder tous les caractères Unicode. Windows est généralement capable d'Afficher des caractères non-BMP, mais pas partout (par exemple, la console ne peut pas).

La fonctionnalité de WideCharToMultiByte est-elle un surensemble de celle de wcstombs, et travaillent-elles toutes les deux sur le même type de chaîne? Ou est-ce que l'un, disons, fonctionne sur UTF-16 tandis que l'autre fonctionne sur UCS-2?

Ne sais pas vraiment, mais je ne pense pas qu'ils diffèrent trop. Je suppose que vous essayez juste de convertir un caractère non-BMP en UTF-8 et de regarder si le résultat est correct.

Les chemins de fichiers sont-ils en UTF-16 ou UCS-2? Je sais que Windows le traite comme un " opaque tableau de caractères " de la documentation de Microsoft, mais selon la norme C pour des fonctions comme fwprintf, y a-t-il un encodage standardisé?

Les chemins de fichiers sont en effet des tableaux opaques de caractères UTF-16, ce qui signifie que Windows n'effectue aucune traduction lors du stockage ou de la lecture de noms de fichiers (comme Linux et contrairement à Mac OS X). Mais Windows a toujours son étrange comportement insensible à la casse, qui cause beaucoup de problèmes car les noms de fichiers traités de manière équivalente ne sont pas nécessairement égaux. Cela casse de nombreux invariants; par exemple, sous Linux sans interférence des autres threads, si vous créez avec succès deux fichiers A et a dans un répertoire, vous vous retrouverez avec deux fichiers distincts, tandis que sous Windows vous n'obtenez qu'un seul fichier (et en général, un nombre imprévisible de fichiers).

Qu'est-ce que le codage" ANSI"? Est-ce même un terme correct? Et comment cela se rapporte-t-il à ASCII?

ANSI est l'organisation américaine de normalisation. L'utilisation de ce mot en se référant à des encodages est un terme impropre, mais fréquent, vous devez donc en être conscient. Je préfère le terme legacy 8-bit encoding , parce que je pense que c'est essentiellement ce que c'est: un encodage non Unicode qui est conservé uniquement pour la compatibilité avec les applications héritées (Windows 9x). Sur les systèmes occidentaux, il S'agit généralement de Windows-1252, qui est un sur-ensemble approprié D'ASCII.

27
répondu Philipp 2011-01-06 12:22:03
  1. *les fonctions a utilisaient la page de Code ANSI active.

  2. *W Fonction utiliser UTF-16.

  3. Multi-byte fait référence à tout ce qui est passé dans le paramètre CodePage. C'est le plus souvent la page de Code ANSI active ou UTF-8.

  4. LPWSTR est une chaîne UTF-16 qui peut ou non être terminée par null (voir MSDN)

  5. Je ne sais rien à propos de wcstombs, j'utilise toujours WideCharToMultiByte.

  6. Les chemins de fichier sont dans UTF-16. En fait, tout le texte est UTF-16 en interne dans Windows.

  7. Pour l'encodage ANSI, vous devrez lire cela en détail. Vous pourriez faire pire que de commencer par Wikipedia et suivre les liens à partir de là.

J'espère que cela aide et que si j'ai quelque chose de mal, quiconque en sait plus, veuillez modifier ceci pour corriger les erreurs!

7
répondu David Heffernan 2012-02-02 13:39:35

Les chaînes larges étaient UCS-2. À partir de Windows 2000, les chaînes larges sont UTF-16. Bon à savoir si vous avez besoin de maintenir un ancien système hérité.

5
répondu Jörgen Sigvardsson 2011-01-06 12:36:47

Tout d'abord, vous trouverez beaucoup d'informations dans ce sujet SO.

ASCII est un jeu de caractères, pas d'encodage. Maintenant, il y a un certain nombre de jeux de caractères 8 bits, l'un d'eux étant défini par défaut dans le système (vous pouvez le modifier dans les paramètres régionaux). * Les fonctions a acceptent des caractères 8 bits dans ce jeu de caractères. UTF-8 n'est pas un jeu de caractères, mais l'encodage du jeu de caractères Unicode. * Les fonctions W, si je comprends bien, utilisent UTF-16 plutôt que UCS-2.

1
répondu Eugene Mayevski 'Allied Bits 2017-05-23 12:24:35