2009-04-19 5 views
3

Note:Représentation de wchar_t et le charbon dans WinDbg

/* 
* Trivial code 
*/ 
wchar_t *greeting = L"Hello World!"; 
char *greeting_ = "Hello World!"; 

WinDbg:

0:000> ?? greeting 
wchar_t * 0x00415810 
"Hello World!" 
0:000> ?? greeting_ 
char * 0x00415800 
"Hello World!" 

0:000> db 0x00415800 
00415800 48 65 6c 6c 6f 20 57 6f-72 6c 64 21 00 00 00 00 Hello World!.... 
00415810 48 00 65 00 6c 00 6c 00-6f 00 20 00 57 00 6f 00 H.e.l.l.o. .W.o. 
00415820 72 00 6c 00 64 00 21 00-00 00 00 00 00 00 00 00 r.l.d.!......... 

Question:

  • Quel est le but de la NULL caractère: 00 entre les caractères ASCII dans wchar_t - Win32?

Répondre

9

wchar_t est une chaîne de caractères larges, donc chaque caractère prend 2 octets de stockage. 'H' comme a wchar_t est 0x0048. Comme x86 est little-endian, vous voyez les octets en mémoire dans l'ordre 48 00.

db dans windbg va vider les octets et fournir comment il est considéré comme une chaîne ASCII, d'où le H.E.L. ... la sortie que vous voyez. Vous pouvez utiliser 'du' pour vider la mémoire en tant que chaîne unicode.

+0

Et 'da' pour ASCII - cool! Merci Michael – Aaron

+0

Il n'y a aucune garantie que sizeof (wchar_t) = 2. Ici (sur GNU/Linux) c'est 4 octets. –

+0

@Bastien: Si vous regardez les balises, je ne suis concerné que par Win32 x86 - Je comprends que la taille diffère entre les OS ... – Aaron

1

wchar_t est pour unicode alors que l'omble est pour la norme 8 bits ascii

dans wchar_t, chaque personnage est représenté sur 16 bits, mais les caractères "standard" assis sur la moitié inférieure du tableau. Par exemple, Traditionnal chinese aurait d'autres valeurs que 00 pour ces octets.

2

La réponse est que les caractères wchar_t sont des quantités de 16 bits, ce qui nécessite deux octets chacun. Chacun représente un caractère UTF-16. Comme les lettres que vous utilisez sont dans la plage ASCII, elles ont des valeurs < 256, donc l'octet haut est zéro pour chaque paire de 2 octets.

Questions connexes