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é?
Répondre
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.
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
@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
@dalle: Cela a beaucoup de sens. Connaissez-vous une fonction qui renvoie le nombre d'octets? – Mike
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.)
BSTRs sur Windows utilisent UTF-16, pas UCS-2. –
* 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
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) –