2010-10-29 18 views
2

Je suis en train d'essayer d'apprendre Unicode? Pour moi, la partie la plus difficile est l'encodage. Le code de contenu BSTRs (Basic String) peut-il pointer U + 10000 ou supérieur? Si non, alors quel est le codage pour BSTR?Est-ce que BSTR UTF-16 est codé?

+0

Je suis sûr que ce sera très utile si vous essayez de comprendre le caractère set, encodage etc etc [encodage et jeu de caractères] (http://phillyjug.jsync.com/file_download/51) –

Répondre

2

Dans Microsoft-speak, Unicode est généralement synonyme de UTF-16 (petit boutiste si la mémoire sert). Dans le cas de BSTR, la réponse semble être cela dépend:

  • sur Microsoft Windows, se compose d'une chaîne de caractères Unicode (large ou caractères à double octet).
  • Sur Apple Power Macintosh, consiste en une chaîne à un octet.
  • Peut contenir plusieurs caractères null incorporés.

Ainsi, sous Windows, oui, il peut contenir des caractères en dehors du plan multilingue de base, mais ceux-ci nécessitera deux « large » pour stocker les caractères.

+2

J'ai démonté les fonctions système SysStringByteLen et SysStringLen. Les deux retournent le préfixe de longueur d'octet, mais SysStringByteLen le divise d'abord par 2. Cela ne signifie-t-il pas que le système utilise l'encodage UCS-2? – Mike

+1

@Mike: Je pense que la documentation de 'SysStringLen' est incorrecte, elle renvoie le nombre d'unités de code ** 16 bits ** dans la chaîne. Les caractères avec le code U + 10000 et supérieur utilisent deux unités de code 16 bits en UTF-16. – dalle

+0

@dalle: Cela a beaucoup de sens. Connaissez-vous une fonction qui renvoie le nombre d'octets? – Mike

1

BSTR sur Windows contenait initialement UCS-2, mais peut en principe contenir l'ensemble du jeu Unicode, en utilisant surrogate pairs. La prise en charge de l'UTF-16 dépend en fait de l'API qui reçoit la chaîne - le BSTR n'a pas d'indication sur la façon dont il sera traité. La plupart des API supportent UTF-16 maintenant. (Michael Kaplan trie les détails.)

Les fenêtres en-têtes contiennent encore une autre définition pour BSTR, il est essentiellement

#if defined(_WIN32) && !defined(OLE2ANSI) 
    typedef wchar_t OLECHAR; 
#else 
    typedef char OLECHAR; 
#endif 
typedef OLECHAR * BSTR; 

Il n'y a pas vraiment de raison de considérer la char, cependant, à moins que vous voulez désespérément être compatible avec quoi que ce soit pour ça. (IIRC il était actif - ou pourrait être activé - pour les versions MFC tôt, et pourrait même avoir été utilisé dans Office pour Mac ou quelque chose comme ça.)

+0

BSTRs sur Windows utilisent UTF-16, pas UCS-2. –

+0

* initialement * contenu - mais j'ai mis à jour pour éviter les malentendus. Dans un sens, un BSTR en lui-même n'est ni UCS-2 ni UTF-16, c'est juste un tableau de 'wchar_t', et par exemple. 'SysStringLen' compte les paires de substitution comme deux caractères. – peterchen