Je ne comprends tout simplement pas et je ne trouve pas beaucoup d'informations sur la fin de Wcharner. P>
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? P>
Si cela se termine par deux octets nuls? Eh bien, je ne suis pas sûr de cela, j'ai besoin de confirmation. P>
4 Réponses :
Ici, vous pouvez lire un peu plus de caractères de large: http://en.wikipedia.org / wiki / wide_character #ze_of_a_wide_character p>
Les terminaisons sont L '\ 0', signifie une null de 16 bits, donc c'est comme deux caractères nuls 8 bits. P>
N'oubliez pas que "009a" est seulement 1 WCHAR, il n'y a donc pas de Null Wchar. p>
É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 code> est de 16 ou 32 bits de large - pour la simplicité, j'assume 16 bits et petite-endian): p>
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 code>. 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 i> par un I> zéro premier i> 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
in c (citant Le projet N1570 A >, section 7.1.1): p>
a large chaîne em> est une séquence contiguë de caractères larges terminés
par et y compris le premier caractère large null. p>
blockQuote>
où un "caractère large" est une valeur de type 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 en C et C ++, la taille d'un en particulier, étant donné que 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 Et ce ne sont pas les seules possibilités. P>
wchar_t code>, qui est défini dans
wchar_t code> 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.) P>
wchar_t code> 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 code> 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. P>
wchar_t code> est plus grand que
char code>, un octet null single em> NULL ne termine pas une chaîne large. P>
0x1234 code>, lorsqu'il est considéré comme une séquence d'octets de 8 bits, peut apparaître comme l'une des: p>
0x12 code>,
0x34 code> li>
0x34 code>,
0x12 code> li>
0x00 code>,
0x00 code>,
0x12 code>,
0x34 code> li> li>
0x34 code>,
0x12 code>,
0x00 code>,
0x00 code> li> li>
ul>
Si vous déclarez
for (int i = 0; i < BUFFER_SIZE; i++) tempWchar[i] = NULL;
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 code> (pas
wcharner code>) est un type prédéfini. Dans C,
wchar_t code> est un typeyef défini dans code>. 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).