原理
URL编码使用 %xx
来表示一个字节。而xx
就是这个字节的十六进制表示。因此编码时,可以将字符串转成UTF-8编码。将每一个字节转成’%xx’形式就是URL编码了。
例如:字符串 “123” 转成utf-8编码就是 0x31
0x32
0x33
共三个字节,然后转成url编码就是 %31%32%33
代码
编码
public static String encode(String text) throws UnsupportedEncodingException {
byte[] data = text.getBytes("utf-8");
char[] hex = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
StringBuffer sb = new StringBuffer();
for(byte b : data) {
sb.append("%");
sb.append(hex[(b & 0xF0) >> 4]);
sb.append(hex[(b & 0x0F) >> 0]);
}
return sb.toString();
}
解码
public static String decode(String code) throws UnsupportedEncodingException {
String map = "0123456789ABCDEF";
if(code.length() % 3 != 0) {
return null;
}else {
byte[] data = new byte[code.length() / 3];
for(int i = 0; i < code.length(); i += 3) {
byte b = (byte) (
map.indexOf(code.charAt(i + 1)) << 4 |
map.indexOf(code.charAt(i + 2)) << 0 );
data[i / 3] = b;
}
return new String(data, "utf-8");
}
}
测试
public static void main(String[] args) throws Exception {
String code = encode("代码大法好");
System.out.println("编码:" + code);
String text = decode(code);
System.out.println("解码:" + text);
}
测试结果: