博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springMVC乱码问题
阅读量:6971 次
发布时间:2019-06-27

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

第一,存文件必须以一种编码存;读文件也必须以一种编码读,如不特别设置,去系统默认的编码,中文windows为GBK编码。

从.java->.class过程是,先编写.java文件并按莫种编码方式保存,然后用javac方法编译此文件,注意如.java没按系统默认编码保存则要带encoding参数指明实际编码,否则出错,生成的.class文件存为系统默认编码。

从.jsp->.java->.class,先存为某种编码的.jsp文件,然后tomcat根据pageEncoding读取并转化为servlet存为系统默认编码,然后同上面.java->.class过程。

第二,IDE的encoding为对系统下文件打开的解码方式或保存的编码方式。特例:如果.jsp文件有<%@ page language="java" pageEncoding="UTF-8"%>,则eclipse会自动存为UTF-8方式,不管eclipse的encoding是什么,这也是eclipse的聪明之处。

第三,

pageEncoding="UTF-8"表示此文件的编码方式,必须与此文件存储方式一致(所以eclipse会首选根据它来存文件),tomcat根据这个来读此.jsp文件并编译为servlet。

<%@ page language="java" pageEncoding="UTF-8"%><%@ page contentType="text/html;charset=iso8859-1"%>test我是个好人会产生乱码,因为存为UTF-8的文件被解码为iso8859-1,这样 如有中文肯定出乱码。至此,页面应为:<%@ page language="java" pageEncoding="UTF-8"%><%@ page contentType="text/html;charset=UTF-8"%>中文问题

第四,

request.setCharacterEncoding("UTF-8")是把提交内容的字符集设为UTF-8
response.setCharacterEncoding("UTF-8")可以把页面中的<%@ page contentType="text/html;charset=iso8859-1"%>换为charset=UTF-8,是给告诉浏览器我这个文件的编码方式。

第五,表单提交:无论何种表单提交都可以在后台的java文件中通过String des = new String(s.getBytes("iso8859-1"),"UTF-8");来转换成你想要的UTF-8编码方式。但如果每处都加词句太麻烦,故分post和get两种方式区分提交(tomcat5以后分开处理,之前处理方式一样,即都可以用request.setCharacterEncoding("UTF-8")方法处理,不过tomcat5以后get提交方法用此语句无效)。

1,post提交的数据: 

程序加上org.springframework.web.filter.CharacterEncodingFilter过滤器. 
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF8
forceEncoding
true
encodingFilter
*.html
encodingFilter
*.jsp

因为规范要求浏览器提交数据都要用utf8编码,所以这里设置编码方式为UTF8. 

特别注意: 

a,这个过滤器只是简单的调用:request.setCharacterEncoding(this.encoding); 
在这个语句之前不能调用任何的request.getParameter()方法,否则会设置tomcat的缺省字符集为"ISO-8859-1",并且使setCharacterEncoding的调用失效.所以在这个过滤器之前的过滤器中不能有对getParameter这类方法的调用,比较安全的做法就是把这个过滤器尽量靠前放. 
b,在server.xml中不能加上<Valve className="org.apache.catalina.valves.RequestDumperValve"/> 
这个value也设置tomcat的缺省字符集为"ISO-8859-1",使setCharacterEncoding的调用失效.可能其他的value也有这个问题,我没有测试过. 
如果要观察http请求参数,可以考虑用过滤器或者其他工具,例如ethereal() 

2,get提交的数据: 

两种情况: 
a,如果从地址栏直接输入汉字,则一般编码为"GBK",需要用 
new String(request.getParameter("something").getBytes("ISO-8859-1"),"GBK") 
取出 
b,如果是页面超连接连接中带的汉字,则编码根据页面编码的不同而不同,如果页面的 
content="text/html; charset=utf-8",则在tomcat/conf/server.xml中的配置文件中: 
<!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8080 --> 
<Connector port="8080" 
maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 
enableLookups="false" redirectPort="8443" acceptCount="100" 
debug="0" connectionTimeout="20000" useBodyEncodingForURI="true" 
disableUploadTimeout="true" /> 
加上:useBodyEncodingForURI="true"即可正常使用getParameter取出正确内容. 
如果content="text/html; charset=GBK",需用 
new String(request.getParameter("something").getBytes("ISO-8859-1"),"GBK") 
取出,其他情况类似. 

总结: 

1,所有页面使用utf8编码, 
2,服务器加上过滤器, 
3,server.xml中不要使用 
<Valve className="org.apache.catalina.valves.RequestDumperValve"/> 
4,server.xml文件加上useBodyEncodingForURI="true" 
这样应该可以搞定大多数前台的中文问题.至于地址栏输入中文,不支持也罢,一般的程序很少要求 
从这里输入.

第六,连接数据库 

1、mysql配置文件:
修改mysql在windows\my.ini里default-character-set=utf-8
2、mysql里数据库和表也都设为utf8_unicode_ci
3、数据库连结:jdbc:mysql://localhost/mydb?useUnicode=true&characterEncoding=utf-8
注意,关键就在于此:此句中间是'&'不是'&'这是因为数据库连结时,在.jsp和.java文件中应该用&号,而XML文件中需要用&
对于Web容器来说,如果你不设置,默认是ISO8859-1
String des = new String(s.getBytes("iso8859-1"),"UTF-8");都可以使用这个 不论哪里,有乱码就是用

转载地址:http://ryasl.baihongyu.com/

你可能感兴趣的文章
【转】UIWebView获取当前页面url的两种方法
查看>>
struts2中使用ajax so easy!!!
查看>>
Hibernate 事物隔离级别
查看>>
Linux ——记一记那恐怖的 rm -f
查看>>
C# 指针之美
查看>>
Oracle 10 参数配置说明
查看>>
解决'System.OutOfMemoryException' 的问题
查看>>
消息队列RabbitMQ和ActiveMQ的生产者流量控制
查看>>
再论 重载、覆盖、多态与函数隐藏
查看>>
Android 用户界面---菜单
查看>>
【学术报告】云山物罩 大话‘大数据’
查看>>
用Setup系列函数完成驱动卸载安装[驱动安装卸载程序]
查看>>
巧妙利用JQuery和Servlet来实现跨域请求
查看>>
JS中生成与解析JSON
查看>>
[开发记录]事件驱动中一种优雅的退出方法
查看>>
java对象转JSON JS取JSON数据
查看>>
Spring MVC 学习 之 - 拦截器
查看>>
Leetcode: Minimum Window Substring
查看>>
jQuery 时间控件推荐
查看>>
27 GroupSock概述(一)——live555源码阅读(四)网络
查看>>