【问题标题】:Representation of wchar_t and char in WinDbgWinDbg 中 wchar_t 和 char 的表示
【发布时间】:2023-03-19 12:02:01
【问题描述】:

注意:

/*
* 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 字符之间?

【问题讨论】:

    标签: c++ winapi x86 windbg


    【解决方案1】:

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

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

    【讨论】:

    • 无法保证 sizeof(wchar_t) = 2。这里(在 GNU/Linux 上)是 4 个字节。
    • @Bastien:如果你看一下标签,我只关心 Win32 x86 - 我知道操作系统之间的大小不同......
    • @Atklin:即使在同一个操作系统上,也不能保证每个编译器都以相同的方式定义 wchar_t。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      在 wchar_t 中,每个字符都用 16 位表示,但“标准”字符位于图表的下半部分。例如,Traditionnal chinese 对于这些字节的值可能不是 00。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-10
        • 2012-06-30
        • 1970-01-01
        • 2016-06-15
        • 1970-01-01
        • 1970-01-01
        • 2012-08-04
        • 1970-01-01
        相关资源
        最近更新 更多