有乙個學員問了乙個關於unicode字元編碼的奇怪問題。
問題如下:
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的最高
bit位是1,當它轉成4位元組的整數時,前面3個位元組的所有bit位都補1,結果就成了0xfffffffe。前面列印出:
ffffffff
fffffffe
2d4e
fffffffd
56實際上是: ff
fe2d
4efd56
前兩個位元組是在說位元組儲存順序!
乙個關於Unicode字元編碼的奇怪問題
有乙個學員問了乙個關於unicode字元編碼的奇怪問題。問題如下 string strchina 中國 1 直接把每個字元中的內容對應著的整數列印出來,顯示的結果就是這個字元的unicode碼,則下面的 for int i 0 i 列印出的結果是 4e2d 56fd 2 下面的 byte buf s...
乙個關於Unicode字元編碼的奇怪問題
問題如下 string strchina 中國 1 直接把每個字元中的內容對應著的整數列印出來,顯示的結果就是這個字元的unicode 碼,則下面的 for int i 0 i 列印出的結果是 4e2d 56fd 2 下面的 byte buf strchina.getbytes unicode fo...
字元編碼 unicode編碼
1.ascii american standard code for information interchange 美國資訊交換標準 這是計算機上最早使用的通用的編碼方案。那個時候計算機還只是拉丁文本的專利,根本沒有想到現在計算機的發展勢頭,如果想到了,可能一開始就會使用unicode了。當時絕大...