声明:本栏目所利用的素材都是凯哥学堂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是封装相应数据的工具,以是它的方法都是与做事端相应信息干系的。