11
votes

WCHAR se termine par un seul octet nul ou deux d'entre eux?

Je ne comprends tout simplement pas et je ne trouve pas beaucoup d'informations sur la fin de Wcharner.

Si cela se termine par un seul octet nul, comment cela ne sait pas la fin de la chaîne, si quelque chose comme ça "009a" représente l'un des symboles Unicode?

Si cela se termine par deux octets nuls? Eh bien, je ne suis pas sûr de cela, j'ai besoin de confirmation.


3 commentaires

en C ++, je n'ai pas connu Wcharner exister ailleurs


Un peu connexe: Faire une résiliation de Wcharar NULL terminée . Pourrait être des conseils là-bas quant à comment aborder cela.


En C ++, wchar_t (pas wcharner ) est un type prédéfini. Dans C, wchar_t est un typeyef défini dans . Dans les deux cas, la taille est définie par la mise en œuvre; Sur mon système, sa taille est de 4 octets (32 bits).


4 Réponses :


5
votes

Ici, vous pouvez lire un peu plus de caractères de large: http://en.wikipedia.org / wiki / wide_character #ze_of_a_wide_character

Les terminaisons sont L '\ 0', signifie une null de 16 bits, donc c'est comme deux caractères nuls 8 bits.

N'oubliez pas que "009a" est seulement 1 WCHAR, il n'y a donc pas de Null Wchar.


0 commentaires

12
votes

Étant donné qu'une chaîne large est une gamme de caractères larges, il ne pouvait même pas se terminer par un one-byte nul. C'est une noix de deux octets nul. (Les tableaux en C / C ++ ne peuvent contenir que les membres du même type, de même de la même taille).

Aussi, pour les caractères standard ASCII, il existe toujours un ou trois octets 0, car seuls les caractères étendus commencent par un NO-ZERO Le premier octet (selon que wchar_t est de 16 ou 32 bits de large - pour la simplicité, j'assume 16 bits et petite-endian): xxx


11 commentaires

ERR, donc si j'accède au tableau de WRCHAR comme ça: arr [0] = 0; Il sera mis à zéro premier et deuxième octet automatiquement?


@Kosmos (si cela n'est pas encore clair, je vous suggère de lire un bon tutoriel sur les indicateurs et les tableaux de C!)


Y a-t-il de toute façon que Wcharar peut être converti en caractères? J'inversant l'application chinoise, mais comme je vois, ils utilisent Char * pour les manipulations de texte. Pourrait-il être juste converti du tableau WCHAR en caractères * de la double taille?


@Kosmos Il existe des bibliothèques avec lesquelles vous pouvez convertir UTF-16 (chaînes larges) en UTF-8.


@ H2CO3: sur mon système, tailleOf (wchar_t) == 4 . Vous semblez aussi faire des hypothèses sur l'endansion.


@KeithThompson Yup, cette taille de taille est parfaitement bien. Et non, je ne fais pas d'hypothèses sur l'endianness - que ce soit peu ou grosse Endian, il est plus facile de concevoir l'essentiel si j'écris tout cela en utilisant la notation de Big Endian ...


J'essaie de résoudre la tâche pour scanner les EXE chinois pour les chaînes de texte, car j'ai besoin de savoir combien d'octets à la fin - deux octets nuls ou 4


@ H2CO3: "Seuls les personnages étendus Démarrez par un zéro premier octet" - qui suppose Big-Endian (avec votre édition récente, vous avez rendu l'hypothèse explicite ).


@Keiththompson Oui, désolé, vous êtes correct - les architectures de processeur modernes qui comptent utilisent la notation de petites-endiennes contre-endiennes, c'est pourquoi je les confondre ...


Étant donné que cette question concerne le double octet null à la fin de la chaîne, il est très étrange que votre chaîne d'échantillonnage ne démontre pas cela.


Bonjour est 72 00 69 00 76 00 76 00 79 00 dans l'ordre d'octets à petit endien. "Endian" dans "Endian" signifie réellement la "extrémité avant" de la séquence: "En format Big-Endian, l'octet le plus important est stocké en premier (a l'adresse la plus basse) ou envoyé en premier, puis les octets suivants sont stockés ou envoyé sous forme de signification décroissante, avec l'octet le moins important stocké en dernier (ayant la plus haute adresse) ou envoyé en dernier. " en.wikipedia.org/wiki/endianness



5
votes

in c (citant Le projet N1570 , section 7.1.1):

a large chaîne est une séquence contiguë de caractères larges terminés par et y compris le premier caractère large null.

où un "caractère large" est une valeur de type wchar_t , qui est défini dans en tant que type entier.

Je ne trouve pas de définition de "chaîne large" dans Le projet de N3337 de la norme C ++, mais il devrait être similaire. Une différence mineure est que wchar_t est un typeydef en C et un type intégré (dont le nom est un mot clé) en C ++. Mais depuis que C ++ partage la plupart de la bibliothèque C, y compris les fonctions qui agissent sur des chaînes larges, il est prudent de supposer que les définitions C et C ++ sont compatibles. (Si quelqu'un peut trouver quelque chose de plus concret dans la norme C ++, veuillez commenter ou modifier ce paragraphe.)

en C et C ++, la taille d'un wchar_t est définie par la mise en œuvre. Il s'agit généralement de 2 ou 4 octets (16 ou 32 bits, sauf si vous êtes sur un système très exotique avec des octets plus gros que 8 bits). Une chaîne large est une séquence de caractères larges ( wchar_t valeurs), terminé par un caractère large null. Le caractère large de terminaison aura la même taille que tout autre caractère large, typiquement soit 2 à 4 octets.

en particulier, étant donné que wchar_t est plus grand que char , un octet null single NULL ne termine pas une chaîne large.

Il convient également de noter que l'ordre d'octet est défini par la mise en œuvre. Un caractère large avec la valeur 0x1234 , lorsqu'il est considéré comme une séquence d'octets de 8 bits, peut apparaître comme l'une des:

  • 0x12 , 0x34
  • 0x34 , 0x12
  • 0x00 , 0x00 , 0x12 , 0x34
  • 0x34 , 0x12 , 0x00 , 0x00

    Et ce ne sont pas les seules possibilités.


0 commentaires

1
votes

Si vous déclarez

for (int i = 0; i < BUFFER_SIZE; i++)
            tempWchar[i] = NULL;


0 commentaires