**:
問題如下:
string strchina = "
中國";
(1
)直接把每個字元中的內容對應著的整數列印出來,顯示的結果就是這個字元的unicode
碼,則下面的**:
for(int i=0; i
列印出的結果是:
4e2d
56fd
(2
)下面的**:
byte buf = strchina.getbytes("unicode");
for(int i=0; i
列印出的結果是:
ffffffff
fffffffe
2d
4e
fffffffd
56
列印出的「ffffffff
」和「fffffffe
」表示什麼?「2d
」和「4e
」為什麼和直接列印的結果是相反的?
回答如下:
在不同體系結構的計算機系統中,utf-16
編碼的unicode
字元在記憶體中的位元組儲存順序是不同的。使用intel cpu
的計算機中,乙個多位元組資料在記憶體中的儲存形式通常是:低位元組在前,高位元組在後,這種方式稱為little-endian
(最不重要的位元組在先)。但是,在使用其他cpu
的一些計算機中,又是以高位元組在前,低位元組在後的方式儲存多位元組資料的,這種方式稱為big-endian
(最重要的位元組在先)。對於0x1234
這樣乙個雙位元組資料,使用little-endian
和big-endian
兩種方式在記憶體中儲存的格式如圖7.4
所示。
對於採用utf-16
編碼的檔案,通常都要用位元組順序標記(byte order mark
,簡稱bom
)來說明檔案中的字元所使用的位元組儲存順序。如果檔案以0xfe 0xff
這兩個位元組開頭,則表明文字的其餘部分是big-endian
的utf-16
編碼;如果檔案以0xff 0xfe
這兩個位元組開頭,則表明文字的其餘部分是little-endian
的utf-16
編碼;如果檔案開頭沒有使用任何位元組順序標記,則暗指全部文字都是big-endian
的utf-16
編碼。「ffffffff
」和「fffffffe
」實際上是0xff
和0xfe
的兩個位元組,把他們當作整數列印時,就成了4
個位元組,由於0xfe
的最高bi
t位是1
,當它轉成4
位元組的整數時,前面3
個位元組的所有bit
位都補1,
結果就成了0xfffffffe
。前面列印出:
ffffffff
fffffffe
2d
4e
fffffffd
56
實際上是:
ff
fe
2d
4e
fd
56
前兩個位元組是在說位元組儲存順序!
乙個關於Unicode字元編碼的奇怪問題
有乙個學員問了乙個關於unicode字元編碼的奇怪問題。問題如下 string strchina 中國 1 直接把每個字元中的內容對應著的整數列印出來,顯示的結果就是這個字元的unicode碼,則下面的 for int i 0 i 列印出的結果是 4e2d 56fd 2 下面的 byte buf s...
乙個關於Unicode字元編碼的奇怪問題
有乙個學員問了乙個關於unicode字元編碼的奇怪問題。問題如下 string strchina 中國 1 直接把每個字元中的內容對應著的整數列印出來,顯示的結果就是這個字元的unicode碼,則下面的 for int i 0 i 列印出的結果是 4e2d 56fd 2 下面的 byte buf s...
字元編碼 unicode編碼
1.ascii american standard code for information interchange 美國資訊交換標準 這是計算機上最早使用的通用的編碼方案。那個時候計算機還只是拉丁文本的專利,根本沒有想到現在計算機的發展勢頭,如果想到了,可能一開始就會使用unicode了。當時絕大...