060_Unicode字符编码
1. Unicode字符編碼
1.1. ?Unicode可以被不同的字符集兼容。最常用的編碼方式是UTF-8和UTF-16。
1.2. UTF8中的字符可以是1-4個字節長。UTF-8可以表示Unicode標準中的任意字符。UTF-8向后兼容ASCII。UTF-8是網頁和電子郵件的首選編碼。
1.3. UTF-16: 16比特的Unicode轉換格式是一種Unicode可變字符編碼, 能夠對全部Unicode指令表進行編碼。UTF-16主要被用于操作系統和環境中, 比如微軟的Windows 2000/XP/2003/Vista/CE以及Java和.NET字節代碼環境。
2. Unicode和UTF-8的區別
2.1. Unicode是一個字符集。UTF-8屬于編碼。
2.2. Unicode是具有唯一十進制數字(代碼點)的字符列表。A = 65,B = 66,C = 67,....
2.3. 更簡單點理解就是Unicode是數字和字符的一對一的映射。
2.4. 這個十進制數字表示字符串"hello": 104 101 108 108 111。
2.5. 編碼指的是如何將這些數字轉換成存儲在計算機中的二進制數字:
UTF-8編碼將像這樣存儲"hello"(二進制): 01101000 01100101 01101100 01101100 01101111
2.6. 編碼將數字轉換為二進制。字符集將字符轉換為數字。
3. UTF-8編碼規則
3.1. 如果一個字節, 最高位(第8位)為0, 表示這是一個ASCII字符(00-7F)。可見, 所有ASCII編碼已經是UTF-8了。
3.2. 如果一個字節, 以11開頭, 連續的1的個數暗示這個字符的字節數, 例如: 110xxxxx代表它是雙字節UTF-8字符的首字節。
3.3. 如果一個字節, 以10開始, 表示它不是首字節, 需要向前查找才能得到當前字符的首字節。
4. 下面是Unicode和UTF-8轉換的規則
| Unicode字符集 | UTF-8編碼 |
| 000000~00007F | 0xxxxxxx????0是標記位, x是實際值。 |
| 000080~0007FF | 110xxxxx 10xxxxxx????110和10是標記位, x是實際值。 |
| 000800~00FFFF | 1110xxxx 10xxxxxx 10xxxxxx????1110和10是標記位, x是實際值。 |
| 010000~10FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx????11110和10是標記位, x是實際值。 |
5. "漢"的UTF-8編碼和Unicode碼的轉換
5.1. "漢"的UTF-8編碼是0xE6B189。
5.2. E6轉換為二進制1110 0110。
5.3. B1轉換為二進制1011 0001。
5.4. 89轉換為二進制1000 1001。
5.5. 按照三個字節Unicode和UTF-8轉換的規則, 區分標記位和實際值: 1110-0110 10-110001 10-001001。
5.6. 取實際值是: 110110001001001。
5.7. 110110001001001轉換為十六進制是0x6C49, 就是"漢"的Unicode碼值。
6. 的UTF-8編碼和Unicode碼的轉換
6.1. 的UTF-8編碼是0xF0A08081。
6.2. F0轉換為二進制1111 0000。
6.3. A0轉換為二進制1010 0000。
6.4. 80轉換為二進制1000 0000。
6.5. 81轉換為二進制1000 0001。
6.6. 按照四個字節Unicode和UTF-8轉換的規則, 區分標記位和實際值: 11110-000 10-100000 10-000000 10-000001。
6.7. 取實際值是: 100000000000000001
6.8. 100000000000000001轉換為十六進制是0x20001, 就是的Unicode碼值。
7. UTF-16編碼
7.1. Unicode字符集的取值范圍是0x0~0x10FFFF, 超出這個區間UTF-16無法表示。
7.2. 0x0~0xFFFF這段區間, 正好是16位, UTF-16和這個區間的Unicode碼, 一一對應。
7.3. 0x10000~0x10FFFF這段區間, 16位存不下, UTF-16使用32位來存儲。
7.4. 首先看看0x10000~0x10FFFF這段區間有多少個碼位, 0x10FFFF-0x10000+1=0x100000, 這個十六進制數轉換為十進制就是: 1048576個碼位。
7.5. 32位分開前16位和后16位, 每個16位各存一半, 那么每一半存的就是1024(由來:√1048576=1024, 也就是1024*1024=1048576), 1024代表的是2的10次冪, 也就是10位二進制數。這樣就知道了, 32位二進制數字中, 前后16位中各存10位就夠用了。
8. UTF-16使用前6位來區分這16位數字代表的位置
8.1. 54開頭的為32位的前16位。
8.2. 55開頭的為32位的后16位。
8.3. 那么54開頭的數據區間是多少呢, 就是1101 10xx xxxx xxxx, 區間就是D800~DBFF。
8.4. 那么55開頭的數據區間是多少呢, 就是1101 11xx xxxx xxxx, 區間就是DC00~DFFF。
9. 為了配合UTF-16編碼, Unicode字符集也將這兩個區間屏蔽掉, 不允許分配任何字符。
10. Unicode碼和UTF-16編碼轉換的規則
10.1. D800轉換為二進制1101?1000?0000?0000。
10.2. DC00轉換為二進制1101?1100?0000?0000。
10.3. DBFF轉換為二進制1101?1011?1111?1111。
10.4. DFFF轉換為二進制1101?1111?1111?1111。
10.5. D800區分標記位和實際值: 110110-0000000000。
10.6. DC00區分標記位和實際值: 110111-0000000000。
10.7. DBFF區分標記位和實際值: 110110-1111111111
10.8. DFFF區分標記位和實際值: 110111-1111111111。
10.9. 前16位最小值D800和后16位最小值DC00, 都取實際值是0, 轉換為十六進制是0x0。
10.10. 前16位最大值DBFF和后16位最大值DFFF, 都取實際值是11111111111111111111, 轉換為十六進制是0xFFFFF。
10.11. 0x0~0xFFFFF + 0x10000 = 0x10000~0x10FFFF。
11. 的UTF-16編碼和Unicode碼的轉換
11.1. 的UTF-16編碼是0xD840DC01。
11.2. D8轉換為二進制1101 1000。
11.3. 40轉換為二進制0100 0000。
11.4. DC轉換為二進制1101 1100。
11.5. 01轉換為二進制0000 0001。
11.6. 按照Unicode碼和UTF-16編碼轉換的規則, 區分前16位和后16位的標記位和實際值: 110110-00 01000000 110111-00 00000001。
11.7. 取實際值是: 10000000000000001
11.8. 10000000000000001轉換為十六進制是0x10001, 再加上0x10000, 0x20001就是的Unicode碼值。
總結
以上是生活随笔為你收集整理的060_Unicode字符编码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 009_Raphael动画
- 下一篇: 010_Raphael事件