URL Decode 的实现原理
Unicode 与 UTF
- Unicode 类似于一本字典,襄括世界上的绝大部分语言中的字符,即解决了字符的编码方式
- 但 Unicode 可能用 2 个字节或 4 个字节对字符进行编码,对于一些本可用较少存储空间的字符(如单字节字符),以及历史字符集的兼容(如 ASCII 先于 Unicode 产生),则需要设计单独的实现方式加以处理,由此产生 Unicode 转换格式(Unicode Transformation Format, UTF),如 UTF-8, GBK, GB2312, BIG5, UTF-16
Unicode 和 UTF-8 之间的转换关系表
字节序列 | Unicode 十六进制码点范围 | UTF-8 二进制 | |||
---|---|---|---|---|---|
Byte 4 | Byte 3 | Byte 2 | Byte 1 | ||
1 | 0000 0000 - 0000 007F | 0xxxxxxx | |||
2 | 0000 0080 - 0000 07FF | 110xxxxx | 10xxxxxx | ||
3 | 0000 0800 - 0000 FFFF | 1110xxxx | 10xxxxxx | 10xxxxxx | |
4 | 0001 0000 - 0010 FFFF | 11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx |
System.out.println((char)0x6c49); // 汉
Unicode 和 UTF-16 转换算法
UTF-16 组成
-
基本平面: U+0000~U+FFFF
- U+0000~U+D7FF
- U+D800~U+DFFF:空段,用于映射辅助平面上的字符
- U+D800~U+DBFF:高位
- U+DC00~U+DFFF:低位
- U+E000~U+FFFF
-
辅助平面:U+ 010000~ U+10FFFF
UTF-16 解码
-
高位:
((unicode 值 - 0x10000) >> 10) + 0xD800
-
低位:
((unicode 值 - 0x10000) % 0x400) + 0xDC00
高位\低位 | 0xDC00 | 0xDC01 | … | 0xDFFF |
---|---|---|---|---|
0xD800 | 10000 | 10001 | … | 103FF |
0xD801 | 10400 | 10401 | … | 107FF |
… | … | … | … | … |
0xD8FF | 10FC00 | 10FC01 | … | 10FFFF |
System.out.println(new String(new char[]{(char)55356, (char)56324})); //