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

2021-08-22 20:23:29 字數 3431 閱讀 8848

**:

問題如下:

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了。當時絕大...