c++ - 为什么字符串有时朝一个方向写,有时朝另一个方向写?

标签 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 );

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

我认为它与编码有关。 0x2e20 或 0x202e 是什么意思吗?

最佳答案

您的字节是 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 的功能。在您的情况下,它显然是无意识版本)。

关于c++ - 为什么字符串有时朝一个方向写,有时朝另一个方向写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18444258/

相关文章:

c# - 创建没有 BOM 的文本文件

python - UnicodeDecodeError,python中Snowball stemming算法的ascii处理

c++ - 使用动态库是否节省内存

perl - 在 Windows 上创建带有 BOM 和 CRLF 行分隔符的 UTF-16LE

c++ - 从嵌套类中对父类进行类型推导

javascript - rails/javascript : "too many parameter keys" - what's a good way to normalize form data?

python - PIL : image from url, 无法识别镜像文件

ios - 检测输入到 UITextfield 的亚洲语言的 unicode 字符

c++ - 求根时的包围算法。 "quadratic"函数中的单根

c++ - 使用 push_back()/pop_front() 或 push_front()/pop_back() 哪个对出队更好