关于字符编码与解码的几个问题,希望大家一起讨论!

ganglong99 2008-12-12 09:51:35
加精
提几个问题:

1.从JSP页面按get或post方式传递参数,到返回结果这个过程中,中文参数会被经过几次字符编码,具体经过哪些编码过程?

2.JSP页面设置的字符编码会对传递的参数进行编码吗?如JSP页面设置为:

<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%>

那么在传递参数之前,会将参数先进行编码成GBK吗?

3.在参数传递到服务器这个过程中(tomcat),会进行几次URLEncoder.encode()编码和几次URLDecoder.decode()解码,并且 编码和解码的时候都采用什么字符编码格式?在传递的过程中是否也会使用new String(s.getBytes("GBK"), "UTF-8")这种方式进行转码或者其他方式进行转码?

4.如果在tomcat的server.xml文件的<Connector>中设置URIEncoding属性,是否会将所有请求进行一次编码,这样的话又是在什么地方进行解码的呢?URLEncoding这个属性设置与不设置的区别如何?

5.如下面代码中,如何再将乱码转换回汉字?

String s = "中文";
try {
s = new String(s.getBytes("GBK"), "UTF-8");
} catch (UnsupportedEncodingException e3) {
e3.printStackTrace();
}
System.out.println(s);

此时,s已经被转换为乱码,如何再将它转换回正常的汉字呢?

以上几个问题,我已经迷惑了好久,始终没有一个清晰的概念,希望大家一起讨论!希望了解的高人们能够给出一个清晰的回答,在参数传递这整个流程中,都经过了哪些关键的编码或转码?
如果有好的资料,也希望不吝分享!
...全文
2302 122 打赏 收藏 转发到动态 举报
写回复
用AI写文章
122 条回复
切换为时间正序
请发表友善的回复…
发表回复
网络科技 2009-05-13
  • 打赏
  • 举报
回复
不错
findee 2009-05-08
  • 打赏
  • 举报
回复
mark ,学习。
gfh1967 2009-05-06
  • 打赏
  • 举报
回复
总结得很精辟,对我整理模糊的认识很有帮助,补充一点,有编码集之间转化是可逆的,不会产生损失,但有的编码集之间转化会造成损失,就没法可逆了。
nftdxnftdx 2009-01-04
  • 打赏
  • 举报
回复
谢谢了,受益非浅
luweifeng1983 2008-12-29
  • 打赏
  • 举报
回复
乱码问题思考及解决方法
一、引起乱码的原因有:
1、响应中的乱码:即显示页面上的乱码,如index.jsp显示出来时,"用户名"显示为乱码
2、表单提交时的乱码:即在表单的文本框中输入为中文的时候提交到服务出现乱码
二、针对各原因的解决思路及方法:
1、响应中的乱码:
说明:
(1).常见的编码方式:
ISO-8859-1,GB18030,GB2312,UTF-8;
(2)pageEncoding的含义:
pageEncoding表示的是该JSP页面的编码,也就是你要保存一个JSP页面,系统会以这个编码来保存(我们知道文本文件另存为的时候会弹出一个提示窗口,你细心一下就会发现原来可以选择不同的"编码"来保存),
同理,JSP文件默认保存的时候会以你设置的pageEncoding的属性值保存该JSP页面。
Eclipse中如果你设置了Window\preferences\jsp files面版上的Encoding为某一个值如GB2312,则以后新建一个JSP文件的时候系统会自动加上pageEncoding="GB2312"这一属性。
注意:pageEncoding="ISO-8859-1"的时候是不能保存中文的,就是说如果你设置为ISO-8859-1,但又想在JSP文件中写一段中文,保存文件的时候会提示不能保存。
(3)JSP实现过程:
客户提交URL请求如:www.WebTest.com/index.jsp
服务器接收到请求
服务器寻找本地文件index.jsp
服务器将index.jsp转译为index.java再编译为index_jsp.class文件,并将其作为响应发给客户端
客户端浏览器解释执行得到HTML代码并显示给客户
由上可见,要解决响应中的乱码问题要注意三点:
I、对本地文件index.jsp的pageEncoding属性检查,因为服务器接到请求后首先是找这个文件。pageEncoding可设为GB18030,GB2312,UTF-8
II、JSP使用<%@ page contentType="text/html; charset=GB2312" %>为响应添加编码信息,这里如果charset="ISO-8859-1",显示出来的中文肯定是乱码。
III、记得在<head></head>中加入<meta http-equiv="Content-Type" content="text/html; charset=GB2312">注意这句话应是在<head>之后的首句话,因为有可能<title>< /title>中使用了中文,
如果加在</title>后,则title内容显示会出现乱码。这里的charset值最好与contentType中的charset值一致。
经过上面三步即可解决响应乱码即显示出来的页面中有乱码的情况。

2、表单提交乱码:
说明:
(1)表单的文本框中输入为中文的时候提交到服务出现乱码的主要原因是:表单提交即发送请求的过程中使用的编码是ISO-8859-1.
表单提交方式有POST和GET,所以表单提交乱码为POST乱码和GET乱码
I、POST乱码
解决方法是在JSP页面中加入语句:<% request.setCharacterEncoding("UTF-8"); %>
II、GET乱码
POST方式下的解决方式还算简单,因为POST方式下提交的数据都是以二进制的方式附加在http请求的body部分发送,只需要在后台指定编码格式就足矣解决。
GET方式下会将参数直接附加到url后面,这部分参数无法使用request.setCharacterEncoding()处理,结果就是get形式的所有中文都变成了乱码。
这里只能对提交的内容转換成字节再转換成另一编码的字符:如下:
<%
String username = request.getParameter("username");
byte[] bytes = username.getBytes("iso-8859-1");
String result = new String(bytes, "gb2312");
out.print(result);
%>
理解起来很简单:首先我要获得与现有编码不同的编码的字符串,String类中构造函数:new String(byte[],charset ch);
那么现在我需要一个字节数组,即要对原来的字符串进行转换,从字符串变成字节数组,String类中的getBytes(charset ch)函数
所以结合起来就是:new String(username.getBytes("iso-8859-1"),"gb2312");
fomyth 2008-12-22
  • 打赏
  • 举报
回复
收藏先
zq_love_hh 2008-12-19
  • 打赏
  • 举报
回复
学习。。。
wyj1983 2008-12-19
  • 打赏
  • 举报
回复
LZ这个讨论不错,学习了!
wyj1983 2008-12-19
  • 打赏
  • 举报
回复
同意87楼说法,我也是这么做的。
酒剑仙 2008-12-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 crjjason 的回复:]
有人说,乱码问题一直跟中国的程序员特别有缘,真是再同意不过了,不管是Struts,JSF,JSP,还是MySQL,Tomcat,全都或多或少有乱码的问题。
一般的做法有用Filter:
< filter >
< filter-name > Set Character Encoding </ filter-name >
< filter-class > org.springframework.web.filter.CharacterEncodingFilter </ filter-class >
< init-param >
< param-name > encoding </ param-name >

[/Quote]
这种方法能解决大部分的乱码。
Danny 2008-12-19
  • 打赏
  • 举报
回复
终于看完了,都有些道理,感觉有点乱,整理中...
business3000 2008-12-18
  • 打赏
  • 举报
回复
关于乱码问题,你要重一开始做网站就要注意,这不是一个局部问题.请设置:
数据库编码,页面编码,代码编码(及所有源文件),为UTF-8,绝杀!
buy_soya 2008-12-18
  • 打赏
  • 举报
回复
什么乱七八糟的
DRBYYW 2008-12-17
  • 打赏
  • 举报
回复
UP 学习了
diwenye 2008-12-17
  • 打赏
  • 举报
回复
学习
yof 2008-12-17
  • 打赏
  • 举报
回复
所有乱码问题中 最麻烦的是 GET 的URL中 ?号后面的参数,它与客户端的浏览器可能还有关系,特别是
对于 Post 提交, 部分参数在 body 中 ,部分在 url 后,就无法写一个统一的取参数的方法。
一般是 通过 request.setCharacterEncoding( "GBK" ); (GBK是提交页面的编码)后, 取 body中的参数
应该没问题,但是 URL 中传递的参数跟浏览器,甚至服务器的版本都可能有关


至于返回到客户端页面的编码, 通过 contentType="text/html; charset=GBK" pageEncoding="GBK"
中的设置一般没有问题。text/html; charset=GBK 是指返回页面的编码。
pageEncoding="GBK"指 jsp 文件本身的编码。

通过 服务器 配置文件,以及 s = new String(s.getBytes("GBK"), "UTF-8"); 等类似的方式处理
乱码的问题不太赞成, 写出的代码通用性差, 代码难看。
Teemo酱 2008-12-17
  • 打赏
  • 举报
回复
随便看看哦·····鼎你的帖子······
qiyingang 2008-12-17
  • 打赏
  • 举报
回复
这是什么语言啊·
qiyingang 2008-12-17
  • 打赏
  • 举报
回复
这是什么语言啊·
zhaitao81 2008-12-17
  • 打赏
  • 举报
回复
up
加载更多回复(99)

81,095

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧