• Java web乱码总结


            Java web常见乱码

    1.乱码显示的位置

    代码编辑器(IDE),浏览器,数据库。

    2.乱码表现形式

    ?,各种看不懂的字符。

    3.乱码根本原因

    字符格式不匹配。

    当我们的系统按照一种编码方式去读取一个文件的时候,会自动的将里面的编码转换成相应的字符显示在屏幕上。参考

    http://geeklu.com/2009/12/dive-into-the-charset-of-java/

     4.分析方法

    创建数据-----传送数据-----接收数据-----存储数据

    分析出错的环节。

    5.乱码可能出现的地方以及解决方法

    1.UTF-8国际编码,GBK中文编码。GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立;

    2.tomcat:默认是ISO8859-1,不支持中文的

    3.java.nio.charset.Charset.defaultCharset() 获得平台默认字符编码;

    4.getBytes() 是通过平台默认字符集进行编码;

    5.浏览器和html之间采用的编码不一致
    解决办法:修改浏览器的编码格式

    修改html页面的编码格式:
    <meta http-equiv="content-Type" content="text/html;charset=utf8">

    jsp2.0中jsp页面编码使用<page-encoding>代替

    6.jsp页面提交form表单时发生的乱码(forward跳转)
    解决办法:

    修改jsp页面的编码格式:
    <%@ page contentType="text/html;charset=utf8" pageEncoding="UTF-8"%>
    此处的charset优先级比pageEncoding低,如果都没有设置,则默认为ISO-8859-1的编码格式。

    还不行就设置jsp页面的request:request.setCharacterEncoding("utf8");

    此外还可以修改后台页面如servlet:request.setCharacterEncoding("utf8");

    servlet向其他页面转发数据时发生的乱码
    解决办法:

    修改response:response.setCharacterEncoding("utf8");

    7.向数据库传数据时的乱码
    解决办法:

    首先数据库编码要统一:1.建立数据库时加上CHARACTER SET 'utf8';2.建数据库表时后面加上:DEFAULT CHARSET=utf8;

    其次要设置连接数据库时的编码: uri="jdbcMYSQL://localhost/xxx?user=root&password=123456&useUnicode=true&characterEncoding=utf-8";

    最后如果还有乱码,则有可能是插入数据时的参数位置没有一一对应。

    8.IDE的字体编码问题,修改ide编码。

    9.servlet和jsp之间传数据时有post和get两种方法,当用post时没有问题,但是当用get时需要加一个字符编码转换:

    10.字符编码过滤器。

    11.js传参乱码

    在js端使用encodeURI(encodeURI(url))进行编码工作;

    在java端使用URLDecoder(url,"URF-8")进行解码工作。

    12.java生成的url中参数乱码

    首先对URL进行URLEncoder.encode("中文字符","UTF-8");

    然后在获取的时候使用new String(request.getparameter("key").getBytes("ISO-8859-1"),"UTF-8")。

    (为什么要对取出的字符集形式转换成UTF-8形式,是因为ISO-8859-1是Java中网络传输使用的标准字符集,request.getParameter("message");得到的还是ISO-8859-1字符集,所以要转换一下。——参考http://m.blog.csdn.net/blog/rugaxm_11109/7804425

    13.tomcat配置对url的编码方式,也可以解决图片中文路径问题。

    <Connector port="8080" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" URIEncoding="UTF-8" />

    14.properties文件乱码

    问题描述:在使用一些类库或者框架时,为了实现页面内容国际化,需要编写对应的properties文件。而properties文件中的中文内容在显示的时候也会出现乱码。

    解决方法:这个乱码问题可以通过jdk中的native2ascii工具解决。使用如下命令:

    native2ascii   -encoding   utf-8  display.properties    display_zh_CN.properties

    出现乱码问题的原因是因为java编译器只能处理Latin-1或unicode编码的字符文件。

    15.Servlet相关的几种乱码原理

    参考http://blog.csdn.NET/haitianxiaowu1/article/details/52460105

    1.浏览器调用jsp,html等页面中文显示乱码

    此情况需满足两个要求:

    文件本身是以utf-8编辑保存的(myEclipse中在properties中鼠标右键选择utf-8),浏览器用utf-8解析:

    (手动)==>在浏览器中右键选择编码格式为utf-8

    (智能)==>在文件中写入如: <meta name="content-type" content="text/html; charset=UTF-8">  通过<meta>标签模拟response头,起到告诉浏览器用utf-8的编码解析

    (智能)==> response.setContentType("text/html;charset=UTF-8");起到告诉浏览器用utf-8的编码解析

    常用:

    <meta name="content-type" content="text/html; charset=UTF-8">或<meta charset="utf-8">

    <%@ pageEncoding="utf-8"%>

    <?xml encoding="UTF-8"?>

    2.通过浏览器调用servlet,页面显示乱码。

    Servlet乱码分为request乱码和response乱码;

    (1)response乱码问题

    解决方法:

    添加:response.setCharacterEncoding("UTF-8");

    response.setContentType("text/html;charset=utf-8");或者 response.setHeader("content-type","text/html;charset=UTF-8");告诉浏览器用utf-8解析。(setHeader是HttpServletResponse的方法。如果想在拦截器Filter中设置字符编码,则无此方法,因为Filter的doFilter方法的参数类型是ServletResponse)

    本质:

    response.setContentType("text/html;charset=UTF-8"); 目的是为了控制浏览器的行为,即控制浏览器用UTF-8进行解码;

    response.setCharacterEncoding("UTF-8");目的是用于response.getWriter()输出的字符流的乱码问题。如果是response.getOutputStream()是不需要此种解决方案的,因为这句话的意思是为了将response对象中的数据以UTF-8解码后的字节流发向浏览器;

    (2)request乱码问题

    request请求分为post和get,对于不同的请求方式有不同的解决乱码的方案;

    GET请求(URI方式传递参数乱码):

    出现情况:浏览器访问<a href=""><form method="get">

    如:<a href="/webproject/display.jsp?username=张三&password=123">显示用户名和密码</a>

    解决方法:问题本质是get方式传递的参数内容默认编码方式问ISO8859-1,而且使用request.setCharacterEncoding("utf-8")也无法解决问题。

    法一:要解决这个问题,修改tomcat服务器的配置文件。修改tomcat目录下的conf/server.xml文件的第43行:

    修改前内容:

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

         maxThreads="150"   connectionTimeout="200000"

         redirecPort="8443"/>

    修改后内容:

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

         maxThreads="150"   connectionTimeout="200000"

         redirecPort="8443"    URIEncoding="utf-8"/>

    法二:String usernameString = new String(username.getBytes("ISO-8859-1"),"UTF-8");
    法三:URL转换 


    有点乱,但是比较全面。

  • 相关阅读:
    pyhton 小技巧
    scikit-learn K近邻法类库使用小结
    机器学习加速方法
    Virtual box安装回退的一系列可能的原因及解决办法
    Linux 定时任务
    Redis 操作命令
    在linux下安装并运行scrapyd
    同步/异步 异步回调 协成 线程队列
    Python常用的标准库以及第三方库有哪些?
    Flask 知识点
  • 原文地址:https://www.cnblogs.com/interfaceone/p/6628590.html
Copyright © 2020-2023  润新知