注意:
/*
* 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.!.........
问题:
wchar_t
- Win32 中的ASCII字符之间的00
? 答案 0 :(得分:10)
wchar_t
是一个宽字符串,因此每个字符占用2个字节的存储空间。 '{'a wchar_t
为0x0048。由于x86是little-endian,因此你会看到内存中的字节数为48 00。
windbg中的db将转储字节并提供它被视为ASCII字符串的方式,因此H.E.L. ...你看到的输出。您可以使用'du'将内存转储为unicode字符串。
答案 1 :(得分:2)
答案是wchar_t字符是16位数量,因此每个字符需要两个字节。每个代表一个UTF-16字符。由于您使用的字母在ASCII范围内,因此它们的值为< 256,因此每个2字节对的高字节为零。
答案 2 :(得分:1)
wchar_t用于unicode,而char用于标准8位ascii
在wchar_t中,每个字符都以16位表示,但“标准”字符位于图表的下半部分。例如,对于那些字节,Traditionnal chinese将具有除00之外的其他值。