4

笔记:

/*
* 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.!.........

问题:

  • NULL字符的用途是什么:00wchar_t- Win32中的 ASCII 字符之间?
4

3 回答 3

10

wchar_t是一个宽字符串,因此每个字符占用 2 个字节的存储空间。'H' 为a wchar_t0x0048。由于 x86 是 little-endian,因此您会看到内存中的字节顺序为 48 00。

windbg 中的 db 将转储字节并提供如何将其视为 ASCII 字符串,因此您会看到 HEL ... 输出。您可以使用“du”将内存转储为 unicode 字符串。

于 2009-04-19T21:30:31.293 回答
2

答案是 wchar_t 字符是 16 位数量,因此每个需要两个字节。每个代表一个UTF-16字符。由于您使用的字母在 ASCII 范围内,它们的值 < 256,因此每个 2 字节对的高字节为零。

于 2009-04-19T21:31:22.757 回答
1

wchar_t 用于unicode,而 char 用于标准 8 位 ascii

在 wchar_t 中,每个字符都用 16 位表示,但“标准”字符位于图表的下半部分。例如,对于这些字节,繁体中文将具有除 00 之外的其他值。

于 2009-04-19T21:30:09.937 回答