編碼
在上一篇文章中,我遇到了關(guān)于swift中的emoj字符串的utf16.cout才能等于NSString.cout的神奇問(wèn)題。處于對(duì)utf8的好奇以及編碼知識(shí)的了解,我決定好好了解下編碼這一個(gè)學(xué)問(wèn)解藻。
Swift5中String.count 與 NSString.length不相等:http://www.reibang.com/p/f135cab4dd45
ASCII標(biāo)準(zhǔn)字符集
ASCII是計(jì)算機(jī)的第一個(gè)編碼標(biāo)準(zhǔn),是按照美國(guó)人的習(xí)慣定制的
-
用1個(gè)字節(jié)來(lái)表示葡盗,并且限制了最高位必須為0螟左,所以只能表示2^7=128個(gè)不同字符啡浊。例如:
- 大寫字符A 在ASCII中用 0100 0001(二進(jìn)制,最高位為0)表示,A在ASCII中的碼位就是0100 0001, 10進(jìn)制為65胶背,16進(jìn)制為0x41
- 范圍就是 0000 0000 -> 0111 1111 共128
-
分為可見字符和控制字符:
- 32-126 代碼可見字符巷嚣,共計(jì)95個(gè)(abcd符號(hào)等可見的字符)
- 0-31,127 代表控制字符,共計(jì)33個(gè)(回車,換行,退格等控制字符)
擴(kuò)展ASCII字符集
一些歐洲國(guó)家在原有的ASCII上進(jìn)行了擴(kuò)展钳吟,也就是把第一位也用上了廷粒,將首位0變?yōu)?,這樣就多出來(lái)了128個(gè)字符红且。這樣擴(kuò)展后的ASCII字符集就有256個(gè)字符了坝茎。
16位字符集
不管是老美的128個(gè)的ASCII,還是老歐的256擴(kuò)展ASCII暇番,這點(diǎn)數(shù)量對(duì)于我們中國(guó)的方塊字來(lái)說(shuō)都是不值一提的嗤放。。壁酬。 太少了
所以我們需要設(shè)計(jì)我們自己的字符集次酌。
GB2312字符集(GB=國(guó)標(biāo))
使用分區(qū)管理,共計(jì)94個(gè)分區(qū)舆乔,每個(gè)區(qū)94個(gè)位岳服,一共8836個(gè)碼位
- 01-09區(qū)收錄除漢字外的682個(gè)字符。
- 10-15區(qū)為空白區(qū)希俩,沒(méi)有使用吊宋。
- 16-55區(qū)收錄3755個(gè)一級(jí)漢字,按拼音排序斜纪。
- 56-89區(qū)收錄3008個(gè)二級(jí)漢字贫母,按部首/筆畫排序文兑。
- 88-94區(qū)為空白區(qū)盒刚,沒(méi)有使用。
例如:“啊“在16區(qū)0排1位绿贞,用2字節(jié)表示為0xB0 0xA1 (0xB0=0xA0+16,0xA1=0xA0+1)(為啥要加A0呢因块,為了避開ASCII中的不可顯示字符。)其實(shí)這里我也就是了解一下籍铁,感興趣的話具體可以看維基百科
GBK
對(duì)GB2312進(jìn)行擴(kuò)充涡上,把空位進(jìn)行填充,形成了GBK編碼拒名。
GB18030
通過(guò)對(duì)GBK擴(kuò)充吩愧,加入少數(shù)民族語(yǔ)言字符等,就形成了GB18030編碼增显。
Unicode
- Unicode雁佳,中文又稱萬(wàn)國(guó)碼、國(guó)際碼、統(tǒng)一碼糖权、單一碼堵腹,是計(jì)算機(jī)科學(xué)領(lǐng)域的業(yè)界標(biāo)準(zhǔn)。它整理星澳、編碼了世界上大部分的文字系統(tǒng)疚顷,使得電腦可以用更為簡(jiǎn)單的方式來(lái)呈現(xiàn)和處理文字。維基百科
- ISO組織定制了通用字符集(英語(yǔ):Universal Character Set, UCS)
UTF-8
- UTF-8是對(duì)Unicode字符集的一種字符編碼 禁偎。
- 針對(duì)每個(gè)字節(jié)的前綴不同腿堤,對(duì)字符集中的有效碼點(diǎn)進(jìn)行編碼,是一種可變長(zhǎng)度的字符編碼
碼點(diǎn)的位數(shù) | 碼點(diǎn)起值 | 碼點(diǎn)終值 | 字節(jié)序列 | Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 |
---|---|---|---|---|---|---|---|---|---|
7 | U+0000 | U+007F | 1 | 0xxxxxxx | |||||
11 | U+0080 | U+07FF | 2 | 110xxxxx | 10xxxxxx | ||||
16 | U+0800 | U+FFFF | 3 | 1110xxxx | 10xxxxxx | 10xxxxxx | |||
21 | U+10000 | U+1FFFFF | 4 | 11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx | ||
26 | U+200000 | U+3FFFFFF | 5 | 111110xx | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx | |
31 | U+4000000 | U+7FFFFFFF | 6 | 1111110x | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx |
例如:
當(dāng)我們?cè)趕wift中打印utf8和unicodeScalars時(shí)候如下
"貓".utf8
? UTF8View("貓")
- 0 : 231
- 1 : 140
- 2 : 171
"貓".unicodeScalars
? StringUnicodeScalarView("貓")
- 0 : "\u{732B}"
unicodeScalars 是字符集的具體碼位如暖,可以用系統(tǒng)的科學(xué)計(jì)算器看一下:
那utf8的數(shù)怎么來(lái)的呢释液?
- 貓:u{732b}的碼位是這樣的:
- 111 0011 0010 1011
- 根據(jù)上面的表,我們找到與對(duì)應(yīng)的規(guī)則為第三排的:
- 1110xxxx 10xxxxxx 10xxxxxx
- 將1的二進(jìn)制碼插入到2的x空位中得出:
- 1110 0111 1000 1100 1010 1011
- 將3換算為10進(jìn)制:
- 231 140 171
- 宗上4步装处,我們就得出了我們?cè)趕wift中顯示的"貓".utf8的三個(gè)數(shù)字了误债。
簡(jiǎn)而言之,unicode是標(biāo)準(zhǔn)妄迁,他包含了utf-8寝蹈、utf-16、utf-32這些編碼登淘。
也包含了ucs-2箫老、ucs-4的這些字符集。
`
更多其他可以參考維基百科:
PS
字節(jié)Byte
1字節(jié)(Byte) = 8位(bit)
1個(gè)16進(jìn)制=4位:
0xf = 1111
所以通常我們1Byte(也就是8bit)會(huì)用兩個(gè)16進(jìn)制來(lái)表示:
0xff = 1111 1111
0x00 = 0000 0000
單位換算
單位 | 單位備注 | 低位兌換 | 低位備注 |
---|---|---|---|
1Byte | 1字節(jié) | 8bit | 8位(0000 0000 - 1111 1111)(0x00-0xff) |
1KB | 1千字節(jié)(Kilobyte) | 1024字節(jié) | 2的10次方字節(jié)(1KB=1024B) |
1MB | 1兆字節(jié)(Megabyte) | 1024千字節(jié) | 2的20次方字節(jié)(1MB=1024KB) |
1GB | 1吉字節(jié)(Gigabyte) | 1024兆字節(jié) | 2的30次方字節(jié)(1GB=1024MB) |
1TB | 1千吉字節(jié)(Terabyte) | 1024吉字節(jié) | 2的40次方字節(jié)(1TB=1024GB) |
比特
二進(jìn)制數(shù)系統(tǒng)中黔州,每個(gè)0或1就是一個(gè)位(bit)耍鬓,位是數(shù)據(jù)存儲(chǔ)的最小單位。其中8bit就稱為一個(gè)字節(jié)(Byte)流妻。計(jì)算機(jī)中的CPU位數(shù)指的是CPU一次能處理的最大位數(shù)牲蜀。例如32位計(jì)算機(jī)的CPU一次最多能處理32位數(shù)據(jù)
- 計(jì)算機(jī)專業(yè)術(shù)語(yǔ),是信息量單位绅这,是由英文BIT音譯而來(lái)涣达。二進(jìn)制數(shù)的一位所包含的信息就是一比特,如二進(jìn)制數(shù)0101就是4比特证薇。
- 二進(jìn)制數(shù)字中的位度苔,信息量的度量單位,為信息量的最小單位浑度。數(shù)字化音響中用電脈沖表達(dá)音頻信號(hào)寇窑,"1"代表有脈沖,"0"代表脈沖間隔箩张。如果波形上每個(gè)點(diǎn)的信息用四位一組的代碼表示甩骏,則稱4比特完残,比特?cái)?shù)越高,表達(dá)模擬信號(hào)就越精確横漏,對(duì)音頻信號(hào)信號(hào)還原能力越強(qiáng)谨设。