servlet编码问题

1. 为什么要使用编码
因为我们之前写的是纯Java语音,java中他默认的全都是utf-8,这当然不会出错。但是现在呢,javaee涉及到了3部分东西:java、浏览器、tomcat。而除了java外他们默认的都是iso885i9-1,假定我们不用中文,那当然没问题,就用他默认的就行。现在我们就是要改变他设置的编码格式,让他能够显示中文,而且不乱码,重点是这个。怎么防止乱码呢,只要抓住一点:用什么方式编的码,就用什么方式解码。下面用一张图先简单说明一下:
这里写图片描述
2. 常见的编码
ASKII码
最早的字符编码,使用一个字节中的7位来表示,一共只有128个。
ISO-8859-1
ISO组织在ASKII基础上定义的编码,用来对其进行扩展,使用一个字节中的8位来表示,一共有256个。
GB2312
国标码,中国规范,主要加入的许多中文。
GBK
同样也是国标码,对GB2312的扩充其中添加了更多的中文。
GB18030
也是国标码,国家强制标准,于GB2312兼容,但实际系统中应用并不广泛。
UTF-8
万国码,支持全部字符,存储效率较高,我们所使用的编码
3. 请求编码
请求编码是浏览器发送给服务器的编码格式。
浏览器发送给服务器的请求编码主要由页面中的Content-Type响应头的编码决定,例如值为:Content-Type: text/html; charset=utf-8,那么页面请求将以utf-8的编码发送。那么,就要求我们必须要将Content-Type的编码设置成utf-8。
虽然浏览器发送来的编码格式已经确定,但是还要注意我们这里服务器中解析编码的格式并不是utf-8还需要我们设置。
Tomcat中默认以iso解析请求,而浏览器是以utf-8发送过来请求,如此一来必定会出现乱码。所以还需要设置解析请求的编码:
POST请求
POST请求比较简单,只需要在通过request对象获取请求参数之前调用request.setCharacterEncoding(“utf-8”)来指定编码。
GET请求
由于Tomcat收到请求后默认会已iso对我们的url在进行解码,所以如果直接设置request的编码是不行的还需要设置我们Tomcat解析uri的默认编码。
在%CATALINA_HOME%/conf/server.xml文件中,找到标签在标签中加入属性URIEncoding=”utf-8”

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

4. 响应编码
响应编码是服务器发送浏览器的编码格式。
Tomcat默认以ISO-8859-1编码响应请求,但是该编码并不支持中文,所以我们在响应中文数据时不能使用该编码,而应该使用“UTF-8”。
设置响应编码:
response.setCharacterEncoding(“UTF-8”);
通过setCharacterEncoding设置的是字符输出流的编码。
这里设置的只是输出的字符编码,但是作为浏览器来说会默认已GBK去解析,所以还需要通过设置请求头告诉浏览器如何解析。
response.setContentType(“text/html;charset=UTF-8”);
实际上我们在调用response.setContentType(“text/html;charset=UTF-8”)时,就已经将我们的输出编码也同时设置了,所以只需要调用此方法即可。
5. URL编码
客户端在向服务器发送请求时需要对非英文数据进行编码操作,编码后在将请求发送服务器,而服务器在收到请求后会自动进行解码操作来解析请求。还记得我们在server.xml中配置的URIEncoding=”UTF-8“吧,它就是来配置Tomcat服务器以何种编码对URL进行解码操作的。
URL编码并不是字符编码,而是浏览器在字符编码的基础上将其转换成试用于互联网传输的编码格式。
例如“李”字的三中编码分别为:
Byte编码:[-26, -99, -114]
URL编码:%E6%9D%8E
解码后:李
在java中可以使用两个类分别进行编码和解码操作
编码:import java.net.URLEncoder;
例如:String encode = URLEncoder.encode(“李”,”utf-8”);
解码import java.net.URLDecoder;
例如:String decode = URLDecoder.decode(“%E6%9D%8E “,”utf-8”);

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值