关于http请求编码问题的说明(转)

转自:https://blog.csdn.net/windowsIOS/article/details/46788577
在进行web开发的时候经常会遇到乱码的问题,乱码一般出现在:

1.写在jsp文件中的中文变成乱码

2.页面的中文都变成乱码

3.后台通过request.getParameter()乱码

编码的基础知识
计算机只能以字节为单位存储和传输信息,而人需要看的是字符串,字节和字符串之间的对应关系就是字符集,例如字符“中”使用UTF-8字符集映射的字节为:E4 B8 AD 三个字节,同样反过来,这三个字节通过UTF-8字符集映射便能得到“中”这个字符,不同的字符集映射规则不一样,能表示的范围也不一样,例如“中”在GB2312中对应的字节表示为:D6 D0 两个字节,字符和字节之间的转换,描述为编码和解码:

l 字符->字节:编码,例如:“中”的UTF-8编码为 E4 B8 AD

l 字节->字符:解码,例如:字节数组D0 D6根据GB2312解码为字符“中”

还有一类编码称为URI编码和URI解码,不过URI编码和解码不是字符串和字节流之间的转换,而是由一个字符串表示另一个字符串,例如:

l “中”的UTF-8 URI编码为 %E4%B8%AD

l 字符串%E4%B8%AD根据UTF-8进行URI解码为字符“中”

可以看出来,URI编码就是将一个字符串用%+对应字符集的编码组织的字符串来表示的,在java中String类有两个常用的方法进行编码和解码:

l getBytes :例如“中”.getBytes(“字符集”),根据指定的字符集进行编码

l String(bytes[],”字符集”):根据自定的字符集对字节数组进行解码

为什么会出现乱码问题
浏览器和服务器通过网络相连,浏览器请求编码成字节流在网络上传输,应用服务器接收到浏览器发送过来的字节流后通过相应的字符集再解码为字符串,如果浏览器和服务器端使用了不同的字符集或者不兼容的字符集就会导致乱码问题,例如,浏览器将“中”按照UTF-8编码为字节E4 B8 AD,在网络上传输,应用服务器接收到字节后按照GBK进行解码,那么前两个字节首先被解码为“涓”了,这只是个简单的过程说明,实际的过程比这要复杂。

因此要搞清web的编码问题,很有必要先弄清请求的过程和过程中的编码和解码。web是请求响应模式,用户操作浏览器,例如点击一个按钮提交表单,或者点击一个超链接,这时浏览器就会向应用服务器发送请求,servlet容器接受到请求后,根据web.xml的设置调用相应的应用程序,应用程序根据发送的请求进行一定的逻辑处理后返回给浏览器一段html代码,浏览器根据html解析并展现给用户,这就是一次请求应答的过程,下面对各部分作更加详细的介绍:

  1. 浏览器向应用服务器发送请求
    具体详见原文

猜你喜欢

转载自blog.csdn.net/caohongxing/article/details/81530737
今日推荐