URL Decode 的实现原理

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}));  // 
上一篇:oracle中decode函数用法及应用


下一篇:浏览器警告Failed to decode downloaded font 系统页面字体图标加载不出来 问题总结