計算機編碼方式 為什麼總是亂碼?

2021-08-22 18:13:29 字數 3007 閱讀 5863

在平時的檔案處理過程中,有時會發現開啟後的檔案內容與預期不符,是一堆看不懂的符號,這主要是因為檔案儲存時選擇的編碼方式與檔案開啟時選擇的編碼方式不一樣。由於大部分編碼方式並沒有乙個唯一標識,這也造成了文字處理工具無法自動識別編碼方式。接下來詳細介紹一下常見的幾種編碼方式

世界上第一台計算機誕生於美國,底層都採用二進位制儲存。由於美國就26個英文本母,加上一些數字和符號,總共也沒多少字元,所以當時就設計了ascii(american standard code for information interchange,美國資訊交換標準碼),僅僅只需要乙個位元組,使用0-127,每乙個數字表示乙個字元,總共128個字元,這樣每乙個字元都能編碼成乙個數字,以二進位制的形式進行儲存。常見的如數字1的編碼為49,字母「a」的編碼為97,字母「a」的編碼為65。

隨著計算機在全世界的普及,很多國家都不使用英文,他們的文字在ascii中是找不到的,所以他們使用128-255這127個數字來表示新的字元,叫做「擴充套件字符集」

等到了中國使用計算機的時候,不包括各種少數民族的文字,單單常用漢字就有6763個,乙個位元組已經遠遠詮釋不了上下五千年的悠久文化了。所以中國國家標準局基於ascii設計了gb2312(資訊交換用漢字編碼字符集),全部使用兩個位元組表示,共收入漢字6763個和非漢字圖形字元682個,其中對於ascii中的128個字元保持不變,在前面新增乙個位元組的0。並且對127及以下的符號、數字、英文本母都使用兩個位元組重新編碼,叫做「全形」字元,而原來ascii中的128個字元叫做「半形」字元。gb2312高位位元組僅使用0xa1-0xf7範圍,低位位元組使用0xa1-0xfe。

gbk編碼基於gb2312,新增了近20000個漢字,gbk僅要求高位位元組大於127,對低位位元組不做限制。

gb18030基於gbk,增加了幾千個少數民族的文字。

ansi編碼就是英文使用ascii編碼,中文使用gb2312編碼

而隨著各個國家都基於ascii進行不同的擴充套件,導致同樣的編碼在不同的國家表示不同的字元,互相都無法解析。iso(international organization for standardization,國際標準化組織)主導設計了unicode字符集,請注意unicode僅僅是一種字符集,而不是編碼方式。

unicode學名為universal multiple-octet coded character set,簡稱usc,俗稱才是unicode,usc可以看作是"unicode character set"的縮寫。unicode規定了符號的二進位制**,但是並沒有規定如何儲存,所以基於unicode,又產生了各種不同的編碼方式。

utf,unicode transformation format:unicode碼轉換格式。utf-8是unicode的一種實現方式,可以用1-4個位元組表示乙個字元,是一種變長的編碼方式,使用變長的編碼方式主要是在盡量多的覆蓋不同字元的情況下,減小儲存空間。(雖然可以對每乙個字元都使用4個位元組進行編碼,但同時也意味著儲存空間的巨大浪費)

變長編碼方式帶來的問題是,假設有3個位元組,無法確定這3個位元組是表示3個字元,還是表示1個字元,所以對utf-8做了一些特殊的編碼規則:

對於單個位元組的字元,最高位設為0,後面7位為這個字元的unicode碼,與ascii相同

對於n(n>1)位元組字元,第乙個位元組的前n位都設定為1,第n+1位設定為0,後面位元組的的前兩位一律設定為10,其餘未說明的為這個字元的unicode碼

utf-8編碼方式

unicode碼(十六進製制)

utf-8編碼(二進位制)

0000 - 007f

0******x

0080 - 07ff

110***xx 10******

0800 - ffff

1110***x 10****** 10******

例如「你」的unicode碼是 「4f 60」,屬於0800 - ffff的範圍內,二進位制表示為0100

1111 01

100000,對應的utf-8則是11100100 10111101 10100000,使用十六進製制表示則是「e4 bd a0」。

utf-16也是一種變長的編碼方式,使用2個或4個位元組表示乙個字元,包括bmp和16個輔助平面。

bmp(basic multilingual plane,基本多文種平面),usc-4根據最高位為0的最高位位元組分為2^7=128個group,次高位2^8=256個plane,每個plane根據第三個位元組分為256行(rows),每行包括256個cells。其中group=0並且plane=0的被稱作bmp。

平面劃分:

0 - ffff的為bmp

10000 - 1ffffd的空間稱作第一輔助平面(supplementary multilingual plane, 簡稱smp),擺放拼音文字(主要為現時已不再使用的文字)及符號

20000 - 2ffffd,第二輔助平面,又稱表意文字補充平面(supplementary ideographic plane, 簡稱sip)

30000-3fffd,第三輔助平面,又稱表意文字第三平面 (tertiary ideographic plane, 簡稱tip)

...utf-16由於使用兩個位元組為基本單位,所以存在位元組序的問題。例如「你」的unicode碼是 「4f 60」,那麼應該儲存為「4f 60」,還是「60 4f」呢?

unicode中推薦的標記字元序的方式是bom(byte order mark,位元組序標誌)。在unicode編碼中,有乙個叫做「zero width no-break space」的字元,它的編碼是feff。在傳輸文字位元組之前,建議先傳輸字元「zero width no-break space」,如果接收者收到的是feff,則代表的是big-endian(「你」應該儲存為「4f 60」),如果收到的是fffe,則表達是little-endian(「你」儲存為「60 4f」)。由於utf-8是單位元組的,所以不存在位元組序的問題,規定可以用bom來表示編碼方式,「ef bb bf」則表示是utf-8編碼。

utf-32規定所有字元均使用4個位元組儲存,這種編碼方式在日常使用中比較少見,因為不再bmp的字元都不常用。

計算機編碼方式

首先需要弄明白一件事,計算機只能識別0,1,因此字元什麼的需要編碼進行儲存,同樣將這些0和1序列表達的意思讀取出來,需要進行解碼。計算機是由老外發明的,他們可沒有什麼漢字 只有abcd.所以呢,最早的編碼 是ascii編碼,最開始是給128個字元進行編碼。但這顯然是不行的啊,世界上除了英語,還有那麼...

計算機常用編碼方式

常用編碼方式 標準ascii碼 擴充套件ascii碼 utf 8 utf 16。用乙個位元組大小表示常用的字元,最開始ascii碼只表示128個字元,只需要7位表示,最高位統一用0表示。ascii碼編碼方式通過大端方式對齊。不同國家,使用的字元不一致,僅僅128個字元不夠使用,所以針對本國字元特點,...

計算機的重點編碼方式

5421bcd碼 2421bcd碼 餘3碼 b b b 0 begin b g b i b oplus g i i 0,1,2.n 2 end 其餘各位為數值 位數稱為字長,其數值稱為真值 類似數學上的絕對值 begin left 原碼 符號位 數值位 反碼 正數和原碼一樣 負數符號位為1,數值按位...