在编写java程序时我们在处理form表单提交过来的action参数时看到浏览器url地址栏get请求提交的中文用户名如:
%E5%B0%8F
像“乱码”的样子。其实这里并不是“乱码”而是处理后的16进制数。
页面中的URL地址是给请求行、请求头传值的,而请求行与请求头是属于http协议规定的ISO8859-1编码, ISO8859-1编码是只支持英文的,对于3个字节的中文是无法识别的,但此时就会可能会想到处理成二进制去传输数据 但是一个中文字符的话是占3个字节,换算成二进制就是3*8=24位,那这么长的数据放入url中显然不符合url阅读, 那么此时用16进制的话是更合理的。如此的话一个字节00000000这8位就装换为两个0000~FFFF, 那么中文字符占3字节,换成16进制就可以用6个0000~FFFF表示一个中文字符啦。 而这时就会想了,url参数信息被编译成ISO8859-1格式的16进制数据了,那么此时如何转回中文字符串呢, url将数据识别十六进制用“%”号来,%号后接两个16进制,一般中文字符前两个字符是%E开头 转成中文字符串有以下难点: 1、怎么判断数据是二进制还是16进制呢 答:%xx%xx%xx为一个字符,x对应的是一个十六进制 2、如果我将数据写成16进制的数据那么会不会背被我解析成中文数据 答:不会的ISO8859-1编码的url是不会识别特殊符号%?+=等等的,会做十六进制处理 3、在URL中数据是如何识别16进制 答:以三个%%%为一个中文字符,进行解析 URLDecoder使用: 答:我们直接用URLDecoder.decode(字符串,“指定编码格式”)。返回的是字符串
如下示例代码如下所示:
String str = URLDecoder.decode("%E5%B0%8F%E9%B8%A1","utf-8");