乙個關於Unicode字元編碼的奇怪問題

2021-08-22 04:21:25 字數 1999 閱讀 1257

有乙個學員問了乙個關於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了。當時絕大...