# URI编码

# 需要进行URI编码的情况

  • 传递的数据中,如果存在用作分隔符的保留字符时需要编码
  • 可能产生歧义的数据需要编码
    • 不在ASCII码范围内的字条
    • ASCII (opens new window)码中不可显示的字条
    • URI中规定的保留字符
    • 不安全字条(传输环节中可能会被不正确处理,如空格、引号、尖括号等)

示例:

  • https://api.test.doamin.com/q?pram=?#543!
    #号是fragment的分隔符,不进行编码的话#号后面的内容会被截断
  • https://api.test.doamin.com/q?pram=你好 编码
    如果此URL直接在浏览器输入能正常工作,因为浏览器会对空格进行编码,如果在编程语言中直接这样写可能会有问题
  • https://api.test.doamin.com/q?pram=你好'>编 码
    此种情况有可能中间的代理服务器会将pram后面的内容进行截断,要先进行编码

# 保留字符与非保留字符

  • 保留字符,主要有两种:gen-delims, sub-delims
    • gen-delims: : / ? # [ ] @
    • sub-delims: ! $ & ' ( ) * + , ; =
  • 非保留字符
    • 字母(ALPHA): %41-%5A and %61-%7A
    • 数字(DIGIT): %30-%39
    • - : %2D
    • . : %2E
    • _ : %5F
    • ~ : %7E, 有些实现会将此符号认为保留字符

# URI编码的格式

  • 百分号编码的格式: %加两个16进制的数字
    • pct-encoded: % HEXDIG HEXDIG
    • US-ASCII: 128个字符(95个可显示字符,33个不可显示字符),参考:https://zh.wikipedia.org/wiki/ASCII
    • 对于HEXDIG十六进制中的字母,大小写等价
  • 非ASCII码字符(如中文): 建议先UTF8编码,再US-ASCII编码
  • 对于URI合法字符,编码与不编码是等价的