• Java乱码解决


     

    简述

    乱码是JAVA开发时经常遇到的问题。主要出现在四种情况:

    1.         系统接口之间

    2.         POST提交数据

    3.         GET提交数据和URL路径

    4.         页面乱码

    系统接口之间乱码

    需要双方定义编码方式。例如:GBK(以下都以GBK为例)。

    发送的时候将String按GBK转换为了字节码

             out.write(loginStr.get(0).getBytes("GBK"));//out为输出流

    接收的时候将字节码按GBK编码转换成String

             new String(by, 0, a, "GBK");//by为字节码,a为字节码长度

    POST 乱码

    一般由Filter设置字符集,开发人员无需关注。

             request.setCharacterEncoding("GBK");

    特殊情况下,各个Servlet也可以按照上面代码设置。

    但要注意,必须在取第一个参数之前就要设置。

    另外

    (1)   上面这个代码只能设置post提交的request body的编码而不是设置get方法提交的queryString的编码。该方法告诉应用服务器应该采用什么编码解析post传过来的内容。

    (2)   HttpServletRequest.getPathInfo()返回的结果是由Servlet服务器解码(decode)过的。

    (3)   HttpServletRequest.getRequestURI()返回的字符串没有被Servlet服务器decoded过。

    (4)   POST提交的数据是作为request body的一部分。

    (5)   网页的Http头中ContentType("text/html; charset=GBK")的作用:

    (a)  告诉浏览器网页中数据是什么编码;

    (b)  表单提交时,通常浏览器会根据ContentType指定的charset对表单中的数据编码,然后发送给服务器的。

    (c)  这里所说的ContentType是指http头的ContentType,而不是在网页中meta中的ContentType。

    GET乱码和URL路径乱码

    URL路径乱码是指用中文路径,如…/中文路径/test.jsp

    GET乱码需要在中间件的配置文件里设置.

             (1) tomcat服务器

    对于tomcat服务器,该文件是server.xml

    <Connector port="8080" PRotocol="HTTP/1.1"

           maxThreads="150" connectionTimeout="20000"

           redirectPort="8443"URIEncoding="GBK"/>

    URIEncoding告诉服务器servlet解码URL时采用的编码。

     

    <Connector port="8080" ... useBodyEncodingForURI="true" />

    useBodyEncodingForURI告诉服务器解码URL时候需要采用request body指定的编码。

     

    (2) weblogic服务器

    对于weblogic服务器,该文件是weblogic.xml

    <input-charset>

     <java-charset-name>GBK</java-charset-name>

    </input-charset>

     

    另外:

             不同的浏览器对于GET方式提交的中文和路径中文都会按照URLEncode自动编码。

    (1)   对于中文IE,如果在高级选项中选中总以UTF-8发送(默认方式),则PathInfo是URL Encode是按照UTF-8编码,QueryString是按照GBK编码。

    http://localhost:8080/example/ 中国?name=中国

    实际上提交是:

    GET /example/$E4$B8$AD$E5$9B$BD?name=$D6$D0$B9$FA ($改为%)

    (2)     对于中文IE,如果在高级选项中取消总以UTF-8发送,则PathInfo和QueryString是URL encode按照GBK编码。

    实际上提交是:

    GET /example/$D6$D0$B9$FA?name=$D6$D0$B9$FA ($改为%)

    (3)     对于中文firefox,则pathInfo和queryString都是URL encode按照GBK编码。实际上提交是:

    GET /example/$D6$D0$B9$FA?name=$D6$D0$B9$FA ($改为%)

    很显然,不同的浏览器以及同一浏览器的不同设置,会影响最终URL中PathInfo的编码。对于中文的IE和FIREFOX都是采用GBK编码QueryString。

    因此一般情况下,我们尽量使用英文路径,而不是中文路径。提交方式尽量使用POST,如果必须要使用GET方式,请主动将PathInfo和QueryString按配置文件中的编码URLEncode。即:直接按统码转换成$D6$D0$B9$FA此种类型的数据。

    页面乱码

    浏览器根据http头中的ContentType("text/html; charset=GBK"),指定的字符集来解码服务器发送过来的字节流。

    1.         Servlet中调用 HttpServletResponse.setContentType()设置http头的ContentType。

    2.         Jsp: <%@ page contentType="text/html;charset=GBK"%>

    3.         注意:HttpServletResponse.setContentType("text/xml;charset=GBK");一定要写在PrintWriter out = HttpServletResponse.getWriter();之前。否则会乱码,尤其是使用Ajax时,以前在项目开发过程中出现过这种问题

    总结

    1.         一般一个系统只使用一个字符集,以免造成混乱。

    2.         Filter、配置文件、JSP中的<%@ page contentType="text/html;charset=GBK"%>都必须写。

    3.         一般路径不要写中文,不般不要使用中文的get方法(QueryString),特殊情况下需要使用时,主动URLEncode。

    4.         接口通信时,双方主动定义一致字符集,按字符集转换成字节码交互。

  • 相关阅读:
    Analysis of Hello2 source code
    CORS’s source, Principle and Implementation
    CDI Features(EL(SPEL),Decorator,Interceptor,Producer)
    Java Design Patterns(2)
    Cookie and Session
    Vue错误信息解决
    cdh搭建仓库
    cdh本地源安装-自用
    创建本地repo源
    dockerfile:python-cuda-nvidia-cudnn
  • 原文地址:https://www.cnblogs.com/Venom/p/4960199.html
Copyright © 2020-2023  润新知