計算機起源于美國,上個世紀蹦锋,他們對英語字符與二進制位之間的關系做了統(tǒng)一規(guī)定兆沙,并制定了一套字符編碼規(guī)則,這套編碼規(guī)則被稱為ASCII編碼
ASCII 編碼一共定義了128個字符的編碼規(guī)則莉掂,用七位二進制表示 ( 0x00 - 0x7F ), 這些字符組成的集合就叫做 ASCII 字符集
隨著計算機的普及葛圃,在不同的地區(qū)和國家又出現(xiàn)了很多字符編碼,比如: 大陸的 GB2312憎妙、港臺的 BIG5, 日本的 Shift JIS等等
由于字符編碼不同库正,計算機在不同國家之間的交流變得很困難,經(jīng)常會出現(xiàn)亂碼的問題厘唾,比如:對于同一個二進制數(shù)據(jù)褥符,不同的編碼會解析出不同的字符
當互聯(lián)網(wǎng)迅猛發(fā)展,地域限制打破之后阅嘶,人們迫切的希望有一種統(tǒng)一的規(guī)則, 對所有國家和地區(qū)的字符進行編碼属瓣,于是 Unicode 就出現(xiàn)了
Unicode 簡介
Unicode 是國際標準字符集,它將世界各種語言的每個字符定義一個唯一的編碼讯柔,以滿足跨語言抡蛙、跨平臺的文本信息轉換
Unicode 字符集的編碼范圍是 0x0000 - 0x10FFFF , 可以容納一百多萬個字符, 每個字符都有一個獨一無二的編碼魂迄,也即每個字符都有一個二進制數(shù)值和它對應粗截,這里的二進制數(shù)值也叫 碼點 , 比如:漢字 "中" 的 碼點是 0x4E2D, 大寫字母 A 的碼點是 0x41, 具體字符對應的 Unicode 編碼可以查詢 Unicode字符編碼表
字符集和字符編碼
字符集是很多個字符的集合,例如 GB2312 是簡體中文的字符集捣炬,它收錄了六千多個常用的簡體漢字及一些符號熊昌,數(shù)字,拼音等字符
字符編碼是 字符集的一種實現(xiàn)方式湿酸,把字符集中的字符映射為特定的字節(jié)或字節(jié)序列婿屹,它是一種規(guī)則
比如:Unicode 只是字符集,UTF-8推溃、UTF-16昂利、UTF-32 才是真正的字符編碼規(guī)則
Unicode 字符存儲
Unicode 是一個符號集, 它只規(guī)定了每個符號的二進制值铁坎,但是符號具體如何存儲它并沒有規(guī)定
前面提到, Unicode 字符集的編碼范圍是 0x0000 - 0x10FFFF蜂奸,因此需要 1 到 3 個字節(jié)來表示
那么,對于三個字節(jié)的 Unicode字符硬萍,計算機怎么知道它表示的是一個字符而不是三個字符呢 扩所?
如果所有字符都用三個字節(jié)表示,那么對于那些一個字節(jié)就能表示的字符來說朴乖,有兩個字節(jié)是無意義的祖屏,對于存儲來說助赞,這是極大的浪費,假如 , 一個普通的文本, 大部分字符都只需一個字節(jié)就能表示赐劣,現(xiàn)在如果需要三個字節(jié)才能表示嫉拐,文本的大小會大出三倍左右
因此哩都,Unicode 出現(xiàn)了多種存儲方式魁兼,常見的有 UTF-8、UTF-16漠嵌、UTF-32咐汞,它們分別用不同的二進制格式來表示 Unicode 字符
UTF-8、UTF-16儒鹿、UTF-32 中的 "UTF" 是 "Unicode Transformation Format" 的縮寫化撕,意思是"Unicode 轉換格式",后面的數(shù) 字表明至少使用多少個比特位來存儲字符, 比如:UTF-8 最少需要8個比特位也就是一個字節(jié)來存儲约炎,對應的植阴, UTF-16 和 UTF-32 分別需要最少 2 個字節(jié) 和 4 個字節(jié)來存儲
詳情請看https://blog.csdn.net/fengjipeng/article/details/119635729