0

这是代码:

byte bytes[] = {0x2e, 0x20, 0x65, 0x00, 0x74, 0x00, 0x61, 0x00, 0x64, 0x00, 0x70, 0x00, 0x75, 0x00, 0x67, 0x00};
std::wstring s;
s.resize( 8 );
memcpy( &s[0], bytes, 16 );

_tprintf( _T("key: %s\n"), s.c_str());
MessageBox ( 0, s.c_str(), _T(""), 0 );

消息框中的结果gupdate在控制台中?etadpug

我认为它与编码有关。0x2e20 或 0x202e 是否意味着什么?

4

1 回答 1

5

您的字节是 UTF-16 中的字符序列(每字符 2 字节编码)。

它在 RTL 覆盖标记之后包含反转的字符串 gupdate(它反转了它之后的符号顺序)。

具体来说:

0x2e, 0x20  = U+202E = Right-To-Left override
0x65, 0x00  = U+0065 = e
0x74, 0x00  = U+0065 = t
0x61, 0x00  = U+0074 = a
etc.

注意字节是如何反转的。

因此,消息框颠倒了字符的顺序,因为它可以识别 unicode 并且可以看到 RTL 覆盖标记。常规控制台输出不是(实际上是,但这取决于您的项目设置和您用于 IO 的功能。在您的情况下,它显然是不知道的版本)。

于 2013-08-26T12:54:39.487 回答