字元編碼問題總結

2021-04-24 08:34:27 字數 3482 閱讀 4898

字元編碼或者字符集由編碼組成,**使得某一字串行匹配於一指定集合中某一東西,例如可能顯示為一種自然數序列,交流所用的字母表或者字音表) 到乙個給定的集合中的其它東西,如乙個自然數序列、8位位元組或者電脈衝,以便於文字在計算機中的儲存和通過通訊網路的傳送。常見的例子包括將拉丁字母表編碼成一些列長短發報電鍵的morse碼和ascii,ascii將字母、數字和其它符號編碼成整數和用7位二進位制表示的這個整數,通常使用另外乙個擴充的0位以便於用8位位元組儲存。在計算機技術發展的早期,諸如ascii(2023年)和ebcdic(2023年)這樣字符集的引入開始成為標準化的過程。這些字符集的侷限很快就變得很明顯,於是人們開發了許多臨時的方法來擴充套件它們。對於支援包括東亞cjk字元家族在內的多用寫作系統的需求要求支援更大量的字元,並且需要一種系統而不是臨時的方法實現這些字元的編碼。

以下是整理:

通常所說的字元編碼指不同語言的字符集在計算機裡儲存的方式,即乙個實際的字元被儲存為乙個位元組或多個位元組序列。標準的ascii碼只佔7位(儲存為乙個位元組時第8位用0填充),共128個字元, 包含了拉丁字母,數字,一些特殊符號和控制符號,適合以英文為基礎的一般使用。由於計算機使用8位為乙個位元組,所以有所謂的擴充套件ascii,新增了128個字元,包括一些帶變音符號的拉丁字元,製表符號和其他特殊符號。擴充套件ascii在dos時代被廣泛採用(有時也稱為ansi),例如,很多dos下漂亮的介面選單其實都是用擴充套件的製表符號「畫」出來的(也因此在現在的一些文字或程式裡有時會看到本來是**的位置出現了亂碼)。

計算機開始在非英語國家普及後,非英語字元的編碼問題就出來了。對於大部分字母為基礎的語言(主要是以拉丁字母為基礎的歐洲語言,也包括其他一些如使用西里爾字母的東歐語言,泰語,阿拉伯語,希伯來語),字元不是很多,所以可以保證標準ascii的字元編碼(0~127)不變,把新增的字元填到另外128個編碼位(128~255)。這樣,所有的字元還是單位元組編碼,這就是所謂的iso8859系列,在windows系統中廣泛採用。值得一提的是,iso 8859-1是windows和internet上常用的西歐語言編碼,包括英語,但是和dos時代的擴充套件ascii編碼不同。

另一些語言,如越南語,印度的幾種語言,字元太多,東亞cjk(中,日,朝韓)語言更是如此,單位元組編碼已經遠遠不夠,因此用上了多位元組編碼,為了與ascii相容,一般盡量不動標準ascii部分的編碼,而把其他編碼位用作多位元組編碼。這樣,ascii的文字在這些語言系統中仍可正常閱讀。這樣得到的是變長度的編碼(舉例來說,在以gb2312編碼儲存的文字中,英文本母對應乙個位元組,漢字對應兩個位元組)。

在windows95/98時期,由於每種語言都用了特定的編碼方式,每個國家/地區銷售的windows95/98分化為相應的語言,無形中造成了計算機世界的分隔:一種語言的文字或程式,在另一種語言的系統上只看到亂碼。如果不借助特殊的軟體(南極星之類),不同國家/地區的文化幾乎無法在計算機上交流。另乙個嚴重的問題是,不同語言混合的文字(例如漢語與希伯來語)無法使用同一編碼儲存,這對於文化的交流是很不方便的。

很自然的可以想象,應該有一種統一的編碼包含所有語言的字元,這就是所謂的unicode。目前在計算機上常用的unicode實現方式包括utf-8,utf-16。utf-8是變長的編碼,與ascii相容。utf-16則是等長的,所有字元都對應兩個位元組(因此與ascii不相容)。utf-16還有所謂big-endian與little-endian之分,代表了pc和蘋果機(還有其他機種)對多位元組資料的哪個位元組是高位的定義不同(其實是歷史遺留問題)。unicode在windows2000/xp得到了廣泛應用,事實上,不同國家/地區銷售的windowsxp之不同之處僅在於選單顯示而已(其實我覺得,這時候還把作業系統分為不同國家/地區的版本完全是人為的,可能是商業策略)。

現在的情況是,各種編碼與utf-8,utf-16同時存在。在windowsxp中,可以選擇非unicode程式使用的語言,系統通過**頁的方式轉換成unicode,從而正常顯示。一些軟體(如ie)可以自動判斷選擇以何種編碼顯示文字,而自動判斷常有不准,需要人工選擇。理想的情況是,所有的文字和程式都使用unicode為基礎的編碼,但是目前困難還很多,有歷史遺留的原因,也有一些國家/地區抵制的因素。

(如果你看得厭倦了,下面將說到有用的內容)

中國使用者常見的編碼方式:

. 擴充套件ascii(純dos程式)

. iso 8859-1(英文為主的西歐語言文字,程式)

. gb2312(最早的簡體中文編碼,現在還廣泛使用,也包括一些其他語言如俄語字元)

. gbk(有時稱為gb13000,與gb2312相容,不是國家正式標準)

. gb18030(最新的簡體中文編碼,與gb2312和gbk相容,字型檔巨大,包含很多其他語言字元,與

unicode相當,據稱現在要在大陸獲得銷售許可的軟體必須支援gb18030)

. big5(正體中文編碼,除基本標準外,有眾多增補版本,不同的增補版互不相容)

. shift-jis(日文常用編碼)

. euc-jis(日文編碼,使用不如shift-jis廣泛)

. utf-8(目前使用最廣泛的unicode編碼,漢字編碼為三個位元組而gb碼只要兩個,這也成為了某些抵制unicode的理由)

. utf-16(unicode編碼,有big endian和little endian,所有字元編碼為兩個位元組,包括拉丁字母)

最新版本的unicode包含了gb18030所有的字元。

編碼只是字元儲存的方式,要將字元在螢幕或印表機上顯示出來,需要用到字型。軟體選擇的字型不包含需要的字元時不能正常顯示(可能顯示為空格,方框或亂碼)。當然字型檔案越大,包含的字元越多能顯示的也越多,但是過大可能對計算機空間,速度造成負擔,所以大多數字型只包含本國語言與少量其他語言的字元。

與編碼有關的常用程式:

notepad(記事本)

儲存時可以選擇使用的編碼方式,不過其名稱很不標準:

ansi->當前設定的非unicode程式區域對應的編碼,如果設定成中國則使用gb2312(還是gb18030 沒試過)

unicode->utf-16 little endian

unicode big endian->utf-16 big endian

utf-8

選擇ansi以外的方式,儲存的文字會被加上三個位元組的檔案頭以表示檔案為unicode編碼,記事本可以識別檔案頭不顯示,但是用其他軟體開啟檔案頭可能會造成問題。沒有檔案頭的時候,程式也會根據內容自動判斷是否unicode,文字內容很少時自動判斷很容易錯。那個流傳的謠言,說記事本輸入聯通後,儲存再次開啟發現燒焦的手機電池(其實不一定是這個,與記事本設定的顯示字型選擇有關),實際上是儲存時用了gb2312(區域設定為中國),再開啟時被誤判為utf-8。

ie(其他瀏覽器應該也一樣)

**網頁時可以選擇編碼。

另乙個有用的功能是,可以開啟文字檔案(.txt),選擇編碼顯示,在需要看異國語言的文字時很方便。

另存為文字檔案的時候可以選擇編碼,因此可以用作文字的編碼轉換。

這樣的方式轉換成utf-8編碼的文字不帶檔案頭,與記事本不同。

字元編碼總結

各種編碼的檔案頭 ff fe unicode fe ff unicode big endian ef bb bf utf 8 unicode也是一種字元編碼方法,不過它是由國際組織設計,可以容納全世界所有語言文字的編碼方案。unicode的學名是 universal multiple octet c...

字元編碼總結

ascii 0 127 gb2312 0xa1a1 f7fe兩個位元組,是對ascii的補充,同時也把ascii中的字元編進 去,成全角字元。gbk 是對gb2312的一種補充,收錄的漢字範圍更大。gb2312標準共收錄6763個 漢字,其中一級漢字3755個,二級漢字3008個 gbk共收入218...

字元編碼總結

編碼字符集 表示某種編碼所涉及到字元的集合。例如ascii字符集 gb2312字符集。僅表示集合,集合元素 即字元 按照某種順序排放,並編上序號。如unicode。字元編碼 把字符集中的字元編碼為二進位制,用來表示字符集中的字元,是字符集的實現方式。如utf 8,utf 16,utf 32就是uni...