2013-08-26 25 views
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是什麼意思?

+0

你的問題到底是什麼?爲什麼_tprintf打印MessageBox的反轉? – Theolodis

+0

@Theolodis是的,我的問題是爲什麼在消息框中刺入是相反的。並在屏幕上是正常的。 – ST3

回答

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的功能,在你的情況下顯然是不知道的版本)。

+0

我查看了關於RTL的信息,發現它的標記是'0x200F',但在我的情況下,它的工作原理是這樣的'202E' – ST3

+1

0x200F是RTL標記,0x202E是RTL覆蓋標記。請仔細閱讀答案。 – DarkWanderer

+0

RLM(右到左標記)僅影響標點符號(即感嘆號將位於左側而不是右側),RLO(右至左覆蓋)更改文本中字母的順序。 – DarkWanderer

相關問題