字符集和字符集編碼詳解

2022-08-05 11:18:14 字數 1665 閱讀 9589

gb2312\gbk\ascii\asni\unicode\utf-8等等,這些字眼非常常見,同時帶來許多的問題。

本文只是從理解的角度,說明以上內容的不同含義從而達到區分其用法的目的是夠了的。至於實現方式,可以查閱各自的詳細標準官方文件。

先解釋一個概念,什麼是字符集,嗯,不解釋了,我弄一個吧: = ,從今以後,1就代表寫了,以此類推,吶這就是字符集了。

電腦科學起源美國,語言以字母拼組而成,為了表示字母、數字、符號(可列印符號以及控制符號)等, 制訂了第一份字符集,就是ascii,字符集的碼錶只有8bit,窮舉只能表示256個字元。

計算機迅速發展,不同國家語言不同,為了使用計算機,只能發展自己的字符集,因為是後來的字符集,是完全相容ascii字符集的,中國的是gb2312,使用2bytes表示一個漢字。後面陸續發現gb2312窮舉的內容不夠了,依照時間順序,以此又搞出了相容gb2312的gbk、又搞出了相容gbk的gb18030。

big5字符集和上面的差不多,只不過是繁體版本的,不過這個是一個單獨分支,與上面的不存在相容關係。

其實上面是有問題的,微軟搞一個作業系統,全球賣,不同國家不同字符集不同的實現方法很煩的(注意這裡的實現方法),跳出兩個大神,一個是iso,說:全球統一用一套把,我來弄,叫ucs,又出來一個,是語言軟體公司聯盟,說:全球一套是對的,不顧我來弄吧,叫unicode。後來過了一段時間,全球兩套字符集確實沒必要,iso和軟體聯盟商量了下,互相相容了(就是一套東西了),所以很多時候,你可以理解ucs與unicode說的是同一個東西。

那麼好了,微軟相對開心了,弄了一個codepage的東西,做了一個unicode與不同國家的東西對映,不同國家的自己的字符集統一叫做了ansi,也就是說,中國大陸是ansi可以是gbk,臺灣的可以是big5。

上面僅僅是字符集,可以裝訂成書大家傳閱,怎麼放到電腦中啊。這就到了編碼實現了。utf-8、ucs-2等,說的就是這個。

這裡有一個比較重要的地方,字符集中的字元的編號與字符集編碼實現中的,也就是計算機中所儲存的編號是不同的。從字符集的編號到字符集編碼實現的編號是需要經過一定的轉換和運算的。utf-8是指unicode的字符集編碼,這是一個變長編碼,也就是說有些字元編碼是一個位元組,如:a,有些字元是兩個或三個位元組,至於其具體的編碼運算規則,請自行查閱utf-8的相關文件。 utf-16\utf-32分別指16bit編碼和32bit編碼,應該是非變長的。usc-2是統一全部使用2bytes編碼,用的不多。

接下來還有最後一個問題bom,這個是由於資料在全球資訊網中傳輸引起的,不同的架構計算機的存在大端小端的不同,為了能夠不同計算機在全球資訊網下協同工作,所以在檔案頭部加入幾個不可見字元,以標識是屬於大端或小端。

具體對應關係如下:

ef bb bf    utf-8

fe ff     utf-16/ucs-2, little endian

ff fe     utf-16/ucs-2, big endian

ff fe 00 00  utf-32/ucs-4, little endian.

00 00 fe ff  utf-32/ucs-4, big-endian.

下面是兩個草圖,供參考:

MySQL字符集

字符集 是一個系統支援的所有抽象字元的集合。字元是各種文字和符號的總稱,包括各國家文字 標點符號 圖形符號 數字等 最早的字符集 ascii...

mysql字符集

character set client character set client 客戶端 資料使用的字符集 告知伺服器自己發來的資料是什麼...

《Mysql 字符集》

一 操作總結 set names utf8 生產環境最常用的字符集指令。一次基本可以涵蓋你本次操作的字符集。 操作作用域為 session 資料庫 建立指定字符集 create database 資料庫名 charset 字符集 檢視使用字符集 show create database 資料庫名 修...