1. URLEncoder.encode()
surrogate pair: UTF-16中用于扩展字符而使用的编码方式,是一种采用四个字节(两个UTF-16编码)来表示一个字符。
encode的原理:
- 首先建立一个dontNeedEncoding集合来保存不需要进行编码的字符,包括a-z, A-Z, 0-9等。
- 对待编码字符串进行循环遍历,对每一位字符c进行验证:
1)如果c在dontNeedEncoding中,即c不需要编码,则直接将其append到结果字符串;
2)如果c不在dontNeedEncoding中,证明c需要被编码,校验当前位与下一位符合hex编码的高低代理位规则,并将他们写入待处理CharArrayWriter中。 - 接下来对charArrayWriter中的特殊字符进行处理:
根据编码方式将其转为byte数组,并进行遍历:对待每一位特殊字符,在其前面加上%,并将其转为16进制字符串,并将转义后的结果append到结果字符串。
2. decode
decode的原理:
- 对待解码字符串进行遍历,对待每一个字符c进行验证:
1)如果为‘+’, 则直接在结果append空格字符' '
2) 如果为'%',则代表其应该是经过编码的特殊字符,则当前位i-->i+2位应该是一个特殊字符的编码结果,将其转回为byte字符;如果遇到i到i+2位之间不符合hex字符规则的情况,则抛出异常;如果再处理后发现字符串仍包含未处理%,则证明该字符串不符合编码规则,抛出异常。