java Web 中文乱码

参考:http://www.cnblogs.com/haimishasha/p/6117968.html  (关于JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换 - 海米傻傻 - 博客园)

参考:http://www.cnblogs.com/haitao-fan/p/3399018.html(浏览器URL编码 - 尼玛范爷 - 博客园)

参考:http://blog.csdn.net/dbb_zifeng/article/details/53304266(中文乱码之填坑Java web - CSDN博客)

今天下载一个中文文件结果是404,文件在路径下存在,将文件名改成英文就可以下载了,所以应该是中文编码的问题。

环境:apache-tomcat-7.0.72

在网上找了一下方法,这些方法是对应服务器端乱码的情况

方法1

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

方法2

String usernameString = new String(name.getBytes("ISO-8859-1"),"gb2312");

方法3

request.setCharacterEncoding("gbk");

一次Http请求

浏览器【get/post】------------>解析URL-------------->获取参数----------返回页面-------------------->浏览器显示

解码过程

浏览器编码------------->服务器解码--------------------->浏览器解码

情况一:中文URL

URL:http://localhost:9080/DataDiscoveryWeb/resources/doc/新建文本文档.txt (这是一个直接访问文件的URL)

问题:访问不到

问题原因:浏览器对中文URL进行编码---------------------->服务器使用了不同于浏览器的编码方式解码

1.浏览器对URL编码

各个浏览器对URL的编码不同

解决方法:手动将此中文进行编码:encodeURI(url),encodeURI编码默认使用的是utf-8编码方式

http://localhost:9080/DataDiscoveryWeb/resources/doc/新建文本文档.txt  ---------> http%3A%2F%2Flocalhost%3A9080%2FDataDiscoveryWeb%2Fresources%2Fdoc%2F%E6%96%B0%E5%BB%BA%E6%96%87%E6%9C%AC%E6%96%87%E6%A1%A3.txt

2.Tomcat服务器对URL解码

  当tomcat接收到该链接时,将会进行URL解码,即去掉"%",同时按照ISO8859-1编码识别。

  Tomcat 默认的解码为ISO-8859-1,所以解析成  http://localhost:9080/DataDiscoveryWeb/resources/doc/??°??o???????????£.txt

解决方法:

  设置Tomcat的Server.xml文件<Connector executor="tomcatThreadPool"  port="8080" protocol="HTTP/1.1"   connectionTimeout="20000"   redirectPort="8443" URIEncoding="UTF-8"/>

  设置URIEncoding="UTF-8"后,使用UTF解码,结果是 http://localhost:9080/DataDiscoveryWeb/resources/doc/新建文本文档.txt

情况二:Get请求参数中有中文

URL:http://localhost:8080/myServlet?name=力量

问题:接受参数乱码

问题原因:问题原因与情况一是一样的,      浏览器对中文URL进行编码---------------------->服务器使用了不同于浏览器的编码方式解码(浏览器对请求参数的编码和URL直接写中文编码可能不同)

浏览器编码: 1.直接地址栏上写http://localhost:8080/myServlet?name=力量        使用的是浏览器默认的编码

       2.在页面上写http://localhost:8080/myServlet?name=力量,使用页面的ContentType定义的Charset,(jsp页面上的contentType="text/html;charset=gb2312")

我的JSP页面代码

<%@ page contentType="text/html;charset=gb2312" language="java" %>
<html>
<body>
<h2>力量</h2>
<a href="/myServlet?name=力量">跳转</a>
<a href="/resources/doc/新建文本文档.txt">下载文件</a>
</body>
</html>

点击跳转,地址栏上变成  http://localhost:8080/myServlet?name=%C1%A6%C1%BF(使用的是contentType中的charset的编码方式)

点击下载文件,地址栏变成      http://localhost:8080/resources/doc/新建文本文档.txt(最终使用浏览器的编码方式   http://localhost:8080/resources/doc/%E6%96%B0%E5%BB%BA%E6%96%87%E6%9C%AC%E6%96%87%E6%A1%A3.txt)

解决方法:

方法1:与情况一的解决方法一样,修改tomcat Server.xml ,<Connector executor="tomcatThreadPool"  port="8080" protocol="HTTP/1.1"   connectionTimeout="20000"   redirectPort="8443" URIEncoding="UTF-8"/>,不过此时页面的contentType中的charset也一定要设置为utf-8

方法2:在获取参数的时候修改

String name = req.getParameter("name");System.out.println(name);String usernameString = new String(name.getBytes("ISO-8859-1"),"gb2312");//此处与页面的contentType中的charset一致System.out.println(usernameString);

情况三:Post请求中参数带中文

URL:http://localhost:8080/myServlet     请求参数 name:力量

问题: 服务器中获取参数String name = req.getParameter("name")  乱码

原因:问题原因与情况一是一样的,      浏览器对中文URL进行编码---------------------->服务器使用了不同于浏览器的编码方式解码

浏览器编码的方式也是根据 contentType中的charse

解决方法:

方法1:与情况一的解决方法一样,修改tomcat Server.xml ,<Connector executor="tomcatThreadPool"  port="8080" protocol="HTTP/1.1"   connectionTimeout="20000"   redirectPort="8443" URIEncoding="UTF-8"/>,不过此时页面的contentType中的charset也一定要设置为utf-8

方法2:与情况二中的解决方法2样,接收参数是转码  String usernameString = new String(name.getBytes("ISO-8859-1"),"gb2312");

方法3:request.setCharacterEncoding("gbk");   一定要在request.getParameter("name")获取参数之前设置编码。

注意:HttpServletRequest.setCharacterEncoding()方法 仅仅只适用于设置post提交的request body的编码而不是设置get方法提交的queryString的编码。问题本质是get方式传递的参数内容默认编码方式问ISO8859-1,而且使用request.setCharacterEncoding("utf-8")也无法解决问题。

时间: 2024-08-25 02:17:38

java Web 中文乱码的相关文章

java web中文乱码处理笔记

一.发生中文乱码的情况有以下三种: 1.表单form的两种提交出现中文乱码 ① get提交   ② post提交 2.超链接(本质是get提交)出现中文乱码 3.sendRedirect(发生乱码) 二.乱码产生的原因: 浏览器编码 utf-8 发送请求给服务器是会产生编码不一致的情况所以在发送请求是先定义编码,就能很好的解决编码的问题 三.解决乱码的几种简单方式: post方法提交:解决方案如下: request.setCharacterEncoding(“utf-8”); get方法使用该方

java web中文乱码解决方案

出现乱码情况 按HTTP请求方式可分为三种 POST,这种乱码其实最容易解决,以spring为例,设置过滤器强制转换字符编码为UTF-8即可. GET,中文字符在URL串中. 解决方法一:在后台取参数值的时候转码 如: String str = new String(param.getString("ISO-8859-1"),"UTF-8"); 此办法确实可行,但在客户端请求字符编码不是ISO-8859-1时,将得不到正确的中文. 解决方法二:在发布中间件上增加UR

Java web中文乱码

1.设置工程的编码方式 window-preferences-general-workspace 改成uef-8 2.设置html的编码方式 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 该语句告诉浏览器该用什么编码打开文件 3.检查文件的编码方式 有时候修改过文件的编码方式后,在eclipse中打开不会显示乱码,需要用特定的编辑器打开看下文件的当前编码方式(推荐使

Java Jsp中文乱码解决方法

自从接触Java和JSP以来,就不断与Java的中文乱码问题打交道,现在终于得到了彻底的解决,现将我们的解决心得与大家共享. 一.Java中文问题的由来 Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦.原因主要有两方面,Java和JSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题. 首先Java(包括JSP)源文件中很可能包含有中文,而Java和JSP源文件的保存方式是基于字节流的,如果Java

java前后台中文乱码问题

前后台中文乱码问题 |-第一: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%> 并且 request.setCharacterEncoding("gb2312"); |-第二:     配置 server.xml. <Con

centos java tomcat 中文乱码解决办法

现象: cenos 部署java web 程序 ,java类中有中文 出现乱码现象 即使使用: System.getProperty("中文") 控制台都出现  ??????  乱码,现象很奇怪 经查: 运行: 此方法 输出中发现有 System.out.println(System.getProperty("file.encoding")); ANSI_X3.4-1968 解决办法: 修改tomcat/bin  下的 catalina.sh 文件   ,在此文件中

java servlet 中文乱码

在servlet中向控制台输出中文乱码: 但是在servlet里的main函数输出,中文是正确的: 通过在main函数里加了一段 System.out.println(Charset.defaultCharset()); 发现在run main函数时,defaultCharset是 utf-8 但是在run servlet时,defaultCharset是Windows-1252

java+mysql中文乱码问题

乱码问题原因有多种,其中有一种是由于MySQL默认使用 ISO-8859-1 ( 即Latin1 ) 字符集,而JAVA内部使用Unicode编码,因此在JAVA中向MYSQL数据库插入数据时,或者读取数据时,都需要先转换一下编码方式.当然,如果可以直接修改配置文件的话,也可以解决乱码问题,然而某些情况下,我们并不能直接接触到配置文件(例如你是买的网上的空间),此时,我们可以采取编码格式转换的方法. 插入数据: 如: ... String str="中文"; String sql =

Java URL 中文乱码解决办法

一. 统一所有的编码格式 (1)JSP页面设置:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> (2)设置编辑器默认的编码格式 例如,我的编辑器是myeclipse,全局编码设置的方法:ToolBar-->Window-->Preferences-->General-->Workspace-->Text file e