博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javaweb中文乱码问题总结
阅读量:5351 次
发布时间:2019-06-15

本文共 4231 字,大约阅读时间需要 14 分钟。

一、文件乱码处理

1、文件默认编码:默认使用项目的默认编码

右击文件->Properties->Resource->Text file encoding

2JSP文件编码:由于JSP要翻译为Servlet

   <%@ page language="java" pageEncoding="utf-8"%>

二、浏览器与服务器传输数据乱码处理

1浏览器端编码,一般由服务器端告诉浏览器如何解码数据:

1.1Servlet

    response.setContentType("text/html; charset=UTF-8"); 或者  response.setCharacterEncoding(“UTF-8”);

1.2JSP

    <%@ page language="java" contentType="text/html; charset=utf-8" %>

1.3、通用

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

1.4Javascript传参乱码

在浏览器端对要传递的中文参数进行编码处理.代码如下:

       xmlhttp.open("POST",url,true); //请求参数初始化
       xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); //因为请求方式为POST,所以这里要设置请求头.(如果请求方式为GET,此句代码可以省略)
       xmlhttp.send("name="+encodeURI(encodeURI("星期日"))); //向服务器端发送参数
在服务器端代码:

页面jsp保证是utf-8编码

<%@ page contentType="text/html; charset=utf-8"%>

接受中文参数

       PrintWriter out = response.getWriter(); //得到response的输出流对象
       String name1 = request.getParameter("name"); //得到KEY"name"的请求参数
       String name = URLDecoder.decode(name1,"utf-8"); //对得到的参数进行解码
       out.print(name); //向浏览器端发送数据

1.5热链接传参乱码

在传参的jsp对中文进行编码:href="new.jsp?name=java.net.URLEncoder.encode("链接")";

在接受的jsp对中文进行转码:String str = URLDecoder.decode(request.getParameter("name "), "utf-8");

注:浏览器编码可以由我们手工修改,但最后不要这样,一般让浏览器自动选择即可。

2、服务器端编码,将客户端传过来的数据进行解码:

浏览器默认使用ISO-8859-1进行编码数据,然后将数据传输到服务器,因此我们默认只需要将浏览器发送过来的数据转换为我们需要的编码即可。

2.1、最简单方式:

    String username = request.getParameter(“username”);

    username = new String(username.getBytes("ISO-8859-1“), "UTF-8");

2.2、比较好的解决方案

// 必须在获取参数之前,调用如下方法先解码 request.setCharacterEncoding(“UTF-8”);

String username = request.getParameter(“username”);

2.3、比较通用方案:在一个Filter中更改所有请求的编码方式:

A、在src中添加filter来设置编码格式是中文,filter类可以在tomcat的包里面:apache-tomcat-6.0.16.zip\apache-tomcat-6.0.16\webapps\examples\WEB-INF\classes\filters下面,SetCharacterEncodingFilter.java文件

B、在web.xml中配置
filter,具体配置如下页:

<filter>

        <filter-name>Set Character Encoding</filter-name>

        <filter-class>filters.SetCharacterEncodingFilter</filter-class>

        <init-param><param-name>encoding</param-name>

       <param-value>utf-8</param-value></init-param>

</filter>

<filter-mapping>

        <filter-name>Set Character Encoding</filter-name>

        <url-pattern>/*</url-pattern>

</filter-mapping>

2.4GET提交方式中文乱码解决

通过修改request.setCharacterEncoding(“UTF-8”);只能解决POST提交方式的请求编码,对GET无效。

A、最简单解决方案:

解决方案不再需要任何额外配置(如filter) TOMCAT默认ISO-8859-1 因此可以设置默认编码为UTF-8解决,在conf\server.xml文件中设置如下 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding=”UTF-8”/>

B、在tomcat4之后,可以通过如下配置来解决中文乱码,但必须配置filter

在conf\server.xml文件中设置如下 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI=“true”/>
然后request.setCharacterEncoding(“UTF-8”)也可解决GET乱码

3Java与数据库之间的乱码:

  大部分数据库都支持以unicode编码方式,所以解决Java与数据库之间的乱码问题比较明智的方式是直接使用unicode编码与数据库交互。很多数据库驱动自动支持unicode,如Microsoft的SQLServer驱动。其他大部分数据库驱动,可以在驱动的url参数中指定,如mysql驱动:

jdbc:mysql://localhost/MYAPPS?useUnicode=true&characterEncoding=GBK

或者使用JAVA程序,修改编码,程序如下:

public class Convert {

  public static String ISOtoGB(String iso){

  String gb;
  try{
    if(iso.equals("") || iso == null){
      return "";
    }
    else{
      iso = iso.trim();
      gb = new String(iso.getBytes("ISO-8859-1"),"GB2312");
      return gb;
    }
  }
  catch(Exception e){
    System.err.print("编码转换错误:"+e.getMessage());
    return "";
    }
  }
}

4Java与文件/流之间的乱码:

  Java读写文件最常用的类是FileInputStream / FileOutputStream和FileReader / FileWriter。其中FileInputStream和FileOutputStream是基于字节流的,常用于读写二进制文件。读写字符文件建议使用基于字符的FileReader和FileWriter,省去了字节与字符之间的转换。但这两个类的构造函数默认使用系统的编码方式,如果文件内容与系统编码方式不一致,可能会出现乱码。在这种情况下,建议使用FileReader和FileWriter的父类:InputStreamReader / OutputStreamWriter,它们也是基于字符的,但在构造函数中可以指定编码类型:InputStreamReader(InputStream in, Charset cs) 和OutputStreamWriter(OutputStream out, Charset cs)。

 

修改Tomcat的编码方式

测试POST中文正常,GET传输中文乱码,确认编码设置正确,所以就想到了是Tomcat的问题了。
默认情况下,tomcat使用的是iso8859-1的编码编码方式,浏览器的embed标签中src指向的地址要通过tomcat去解析。如果包含中文,采用这种编码方式就会出现乱码问题,而在这种情况下,乱码问题就表现出无法访问该音频文件了。
解决方法很简单:
修改tomcat下的conf/server.xml文件,找到如下代码:
connectionTimeout="20000"
redirectPort="8443" />
这段代码规定了Tomcat监听HTTP请求的端口号等信息。可以在这里添加一个属性:URIEncoding,将该属性值设置为UTF-8,即可让Tomcat(默认ISO-8859-1编码)以UTF-8的编码处理get请求。更改后的代码如下所示:
URIEncoding="UTF-8"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />

参考文献:

转载于:https://www.cnblogs.com/xieyuan/p/3787512.html

你可能感兴趣的文章
加固linux
查看>>
Hyper-V虚拟机上安装一个图形界面的Linux系统
查看>>
【Crash Course Psychology】2. Research & Experimentation笔记
查看>>
shell cat 合并文件,合并数据库sql文件
查看>>
python全栈 计算机硬件管理 —— 硬件
查看>>
Delphi7编译的程序自动中Win32.Induc.a病毒的解决办法
查看>>
egret3D与2D混合开发,画布尺寸不一致的问题
查看>>
浅谈性能测试
查看>>
Winform 菜单和工具栏控件
查看>>
CDH版本大数据集群下搭建的Hue详细启动步骤(图文详解)
查看>>
巧用Win+R
查看>>
Python中的greenlet包实现并发编程的入门教程
查看>>
java中遍历属性字段及值(常见方法)
查看>>
YUI3自动加载树实现
查看>>
kettle导数到user_用于left join_20160928
查看>>
较快的maven的settings.xml文件
查看>>
随手练——HDU 5015 矩阵快速幂
查看>>
malloc() & free()
查看>>
Java变量类型,实例变量 与局部变量 静态变量
查看>>
mysql操作命令梳理(4)-中文乱码问题
查看>>