java基础——servlet乱码问题

servlet 乱码问题

1. 乱码的本质

乱码的本质就是文件或者流存的编码与读的编码不一样,就会导致乱码。

2.常用的编码

  • gb2312gbkgb1830(系统默认编码,中国的国标码)

GB2312兼容ASCII码,这部分还是每个字符占1个字节。每个汉字字符占2个字节。GB2312兼容ASCII码,这部分还是每个字符占1个字节。每个汉字字符占2个字节

  • Unicode(万国码,统一码):

它为每种语言中的每个字符设定了统一并且唯一的编码,以满足跨语言、跨平台进行文本转换、处理的要求。

  • utf-8(支持全世界的编码):

UTF-8对不同范围的字符使用不同长度的编码,ASCII编码部分与ASCII一样,都是1个字节。而汉字部分都是3个字节。

  • iso-8859-1(不支持中文):

tomcat的默认编码

3.response响应乱码

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

添加上面语句,发现客户端浏览器仍然乱码。
原因:浏览器以默认的编码解析服务器编码的数据。
结论:response.setCharacterEncoding("utf-8");只是告诉tomcat用什么编码响应数据。

3.2: 添加 response.setHeader("content-type", "text/html;charset=UTF-8");

添加上面语句,发现客户端浏览器成功解决乱码。
原因:浏览器以与服务器相同的编码方式解析。
结论:response.setHeader("content-type", "text/html;charset=UTF-8");告诉浏览器用什么编码方式解析数据。

综上给出解决response乱码方案:

response.setHeader("content-type", "text/html;charset=UTF-8");
response.setCharacterEncoding("utf-8");

另一种方案:

//告知服务器用什么码表编码,同时告知浏览器用什么码表解码。

response.setContentType("text/html;charset=utf-8");

4.request请求乱码

  • post乱码

浏览器发送post请求时,浏览器使用的什么编码提交那么post就是什么编码。
由于客户端没有告诉服务器,请求正文的编码,于是服务器默认用ISO-8859-1进行编码

4.1 添加 request.setCharacterEncoding("utf-8"); 

成功解决乱码
原因:诉服务器请求正文的数据应该使用的编码是什么

  • get乱码

浏览器发送get请求时,浏览器使用的什么编码提交那么get就是什么编码。
但是当请求到达服务器后,get请求后面的参数默认使用iso-8859-1进行编码。导致乱码。

4.1 添加 request.setCharacterEncoding("utf-8"); 

上面代码执行后无效,没能成功解决乱码。
原因:此种解决方法只对post有效

4.2 
 //拿到原始的二进制数据,用UTF-8进行重新编码
String name = reuqest.getParameter("name");
byte b[] = name.getBytes("ISO-8859-1");//1010101
String name = new String(b,"UTF-8");//解决

5.另一种解决乱码的方法

tomcat安装目录conf/server.xml下有如下的配置:

 <Connector port="80" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

我们可以在里面添加一个与编码有关的参数信息:URIEncoding,该配置决定了使用get请求通过浏览器地址访问栏的编码方式,默认的是iso-8859-1。
在官方文档中国有说明的:https://tomcat.apache.org/tomcat-7.0-doc/config/http.html

于是我们可以这么配置:

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

6.总结

servlet中的乱码是由于tomcat默认的编码是iso-8859-1 不支持中文,使用中文时就会出现问题。解决乱码也要分情况讨论,响应或者请求,后者又分为get与post两种情况,当然有时还要考虑数据库乱码问题。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容