关于乱码问题的解决与HttpServletResponse中的方法

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。

关于乱码问题的解决

会有乱码现象,其实就是因为字符集编码不一致的问题,就好像中国人和外国人谈话一样,互相不懂对方在说啥。字符集编码也是如此,本来就是一段GBK编码的文字,却要用utf-8的编码格式去解码,就当然是鸡同鸭讲会出现乱码啦,这个时候就得使用GBK编码的格式去解码才不会出问题。如果互相都是使用的GBK编码后,那就像中国人和中国人都说普通话一样,就能听懂对方在说什么,这样才不会出现乱码。

在web开发中,请求或响应数据时出现乱码,往往就是客户端和服务端的编码不一致的问题所导致的。

不过在介绍如何解决乱码的问题前,我们先看看HttpServletRequest中关于获得表单数据的一些方法,虽然在上一篇也介绍了使用方式,不过关于乱码和拿到具体的值这方面没有涉及到:

获得和设置表单数据方法(如果是上传文件的话则无法获取文件中的数据):

既然和表单有关,那么就得先写一个简单的html表单代码,我们可以在Eclipse中创建一个html文件:

可能使用Eclipse编写HTML的代码不太方便,我们也可以使用一个专门编写html代码的工具来编写Eclipse里已经创建了的html文件,我这里使用HBuilder作为示例:

1.复制Eclipse中的html文件所在目录的路径:

2.在HBuilder中点击文件,然后选择打开目录把复制的文件路径粘贴进去,并为这个工程起一个新的名称:

工程目录如下:

如图,可以看到index.html已经在这个工程下了,我们可以在HBuilder中编辑这个html文件,编辑的内容会同步到Eclipse,因为它俩访问的都是同一个目录同一个html文件。

3.我在HBuilder编辑的代码如下:

4.再看看Eclipse发生了什么:

可以看到代码是同步的。

浏览器运行结果:

以下使用实际代码演示常用的几个获得表单数据的方法,代码示例:

在Eclipse中执行html文件,Eclipse有一个内置的浏览器:

如果要在其他的浏览器则需要使用这个URL地址:

http://localhost:8080/TestResponse/index.html

不要直接在HBuilder中运行这个html文件,因为它的URL是指向HBuilder的工程路径的。

控制台打印结果:

如图,可以看到我们将所有的值都获得到手了。

获得表单数据的时候要注意一个问题:当你需要获得一个属性的值时,如果得到的结果为null,那么就是因为表单数据中并没有这个属性的存在。例如我获得一个不存在的属性:

控制台打印结果:

可以看到结果为null,所以当你获得表单数据进行某些操作时,出现了空指针异常的话,很有可能就是因为代码上写错了获得了一个不存在的属性。

如果表单数据中的某个属性值没有写,那么获得的将是一个空字符串,而非null,例如:

控制台打印结果:

如图,并没有打印null,而是打印空白,这个空白就是一个空字符串:’’

会出现乱码的情况,以及解决方法:

现在我们修改一下代码把表单提交的方法改为post,再运行一次,看看控制台的打印结果,html代码示例:

Java代码示例:

提交的表单:

控制台的打印结果:

可以看到控制台中的打印结果出现了不能识别的字符,解决方法很简单,使用setCharacterEncoding(String)方法,设置表单提交的数据的编码格式即可:

运行结果:

注意:除了在Java代码中需要设置编码格式,在html文件中也要设置好编码格式,如果html中不设置编码格式的话,即便在Java代码中使用了setCharacterEncoding(String)方法设置了也没有用,所以这是双向的,例如我把html文件中设置编码格式的标签给删掉:

可以看到在网页上显示都是乱码(这是因为Eclipse内置的浏览器原因,一般市面上的浏览器提前预设了字符编码,所以不会出现这种情况)

控制台打印结果:

果然出现了不能识别的字符,所以html文件也是需要设置好编码的,不然的话就会出现乱码的情况。

下面来看看浏览器的地址栏中为什么能够显示中文:

这其实是因为浏览器转码了,可以把这个URL复制到记事本中:

可以看到是一堆的编码,并没有显示中文,所以实际上浏览器就是把这个编码给转换成了中文而已。

只要不属于128个字符内的字符,在地址栏中都会转换成这种格式的编码,这些编码格式是采用的16进制的编码格式,以上面这文本示例编码对应的中文:

如图,每一个16进制编码都是以%开头,这是utf-8编码的中文,所以一个中文字对应3个16进制编码。

如果是GBK编码格式的中文则是一个中文字对应2个16进制编码,但是GBK编码格式转换成的16进制编码不能被浏览器转换,会仍然显示着16进制编码:

中文字对应的16进制编码:

如图,GBK编码格式的中文字和utf-8编码的中文字不一样,是2个16进制编码对应一个中文字。

关于客户端请求数据方面的乱码情况就介绍这么多,另外响应数据中出现乱码的情况和解决方法在介绍HttpServletResponse方法部分进行说明。

思维导图:

HttpServletResponse中的方法

HttpServletResponse接口类型的对象是封装服务端响应数据的,所以这个对象中的方法都是与响应数据相关。以下罗列一些常用的方法:

下面使用实际的例子,演示以上方法的使用方式:

编辑响应头一类的方法:

代码示例:

在服务端设置响应数据的编码格式是很有必要的,这么做同样的也是为了避免出现乱码的问题。例如以下这个示例,我不设置响应数据的编码格式,并输出一段中文,看看会发生什么,代码示例:

运行结果:

如图,可以看到,没有设置响应数据的编码格式的话,输出中文就会无法被识别。

这种问题设置一下响应数据的编码格式就好了,但是服务端设置的编码格式,要与浏览器端的编码格式对应上,如果不对应的话仍然会是乱码,代码示例:

运行结果:

添加新的响应头数据:

代码示例:

打开TCP/IP Monitor窗口,可以看到以上代码添加进响应头的数据:

获得设置的响应头信息:

代码示例:

控制台打印结果:

修改响应头信息:

代码示例:

TCP/IP Monitor窗口:

总结:

解决客户端表单提交数据乱码的问题,需要使用setCharacterEncoding(String)方法,设置好与客户端对应的编码格式。

解决服务端响应数据乱码的问题,则使用setCharacterEncoding(String)方法,设置好对应的编码格式。

HttpServletRequest是封装请求数据的对象,所以它的方法都是与客户端请求信息相关的。

HttpServletResponse是封装响应数据的对象,所以它的方法都是与服务端响应信息相关的。

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 编码问题一直困扰着开发人员,尤其在 Java 中更加明显,因为 Java 是跨平台语言,不同平台之间编码之间的切换...
    x360阅读 2,463评论 1 20
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,386评论 25 707
  • 这些天忙成鬼,看了些关于区块链的书,记了写东西。 就当是给区块链的情书吧。 十年后的区块链就是今天的互联网。 20...
    金金视界阅读 171评论 0 1
  • 文/瓦哨 老屋终究是带着我童年的记忆一起老了,快的让我措手不及,那是我深深眷恋的老屋啊! 童年的时光总是那样美好,...
    瓦哨阅读 244评论 4 3