为什么字符串有时写在一个方向,有时在另一个方向?

ST3*_*ST3 0 c++ encoding byte-order-mark wstring

这是代码:

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 );
Run Code Online (Sandbox Code Playgroud)

消息框中的结果gupdate位于控制台中?etadpug.

我认为这是编码.0x2e20或0x202e是什么意思吗?

Dar*_*rer 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.
Run Code Online (Sandbox Code Playgroud)

请注意字节是如何反转的.

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