JavaWeb开发中的字符编码问题的直截了当解决方案

2017-01-11 • 技术文章评论

解决方案

从容器字符编码配置、响应头设置、Meta字符集设置全部统一为UTF-8,不要通过自己写代码做层层转码。

容器:URI_ENCODING=UTF-8,USE_BODY_ENCODING_FOR_QUERY_STRING=true

ContentType:text/html; charset=UTF-8

Meta:charset=UTF-8

当然,对于用户可以手动拼参数的场景,比如定制百度搜索,那么应该具备自动探测编码的能力,而不是仅固定支持,百度可以自动识别queryString的编码是个很好的范例。

备注

HttpServletRequest.setCharacterEncoding方法仅仅只适用于设置POST提交的RequestBody部分的数据的编码而不是设置GET提交的queryString的编码。

HttpServletRequest.getPathInfo和getParameter返回的结果是由Servlet服务器解码过的。

HttpServletRequest.getRequestURI返回的字符串没有被Servlet服务器解码过。

编码随谈:加号与空格

URI把允许出现的字符分为保留未保留。百分号编码一个保留字符,其实是在这个字符的16进制ASCII值前面加上转义字符%,未保留字符不需要被百分号编码。对于那些不在保留字符和未保留字符范围内的字符,先转换为UTF-8字节序列,然后对其字节值使用百分号编码。在正常的编码解码流程中,编码的时候先把加号替换为%2B,然后把空格替换为加号;解码的时候先把加号替换为空格,再把%2B替换为加号,就是正常的。但是在已经urlencoded的内容中如果使用这二者不慎,就很有可能造成编解码不正确的问题了。