数据在传输或是存储过程中,都是以字节的方式在运行,所以就有了编码问题。
用户想服务器发送一个HTTP请求,需要编码的地方有url、cookie、parameter,经过编码后服务器接受HTTP请求,解析HTTP请求,然后对url、cookie、parameter进行解码。在服务器进行业务逻辑处理过程中可能需要读取数据库、本地文件或者网络中的其他文件等等,这些过程都需要进行编码解码。
常见编码方式:
- ISO-8859-1,拉丁编码,没有中文编码,所以一定会乱码。
- GBK,GB2312,中国的国标码,目前中国境内的浏览器的默认编码就是GBK。
- UTF-8,支持全世界各个国家的编码,一般就用它。
与编码有关的字符串方法:
- getBytes(String charset)
- new String(byte[] bytes,String charset)
-
html
本身含有编码格式,所以无须担心浏览器解析html页面。 -
request
html页面的编码方式一般情况下已经被设置成了UTF-8,所以我们只需要设置服务器端的解码方式也为UTF-8即可。
request.setCharacterEncoding(charset);
必须写在第一次使用request.getParameter()之前,这样才能保证参数是按照已经设置的字符编码来获取。
只对消息体中的数据起作用,能解决表单方法为POST的中文乱码情况。而方法为GET的依然为乱码,对于URL中的参数不起作用。 -
get请求参数
对于get请求方式,理论上,我们也只需要告诉服务器以UTF-8的方式解码即可,但不幸的是,它不允许我们以编写代码的方式来更改服务器的解码方式,只能通过修改服务器的配置文件。
既然不能通过编写代码的方式来更改解码方式,那怎么解决这个问题呢?其解决办法就是反编码:
String str=new String(request.getParameter("变量名").getBytes("ISO-8859-1"),"UTF-8");
-
response
默认编码方式是ISO-8859-1。
response.setContentType("text/html;charset=UTF-8");
这句代码也是在设置了浏览器的解码方式的同时也设置了服务器段的编码方式。
必须写在PrintWriter out =request.getWriter()之前,这样才能保证out按照已经设置的字符编码来进行字符输出。 -
cookie
cookie的键值中包含了逗号、分号、空格就会导致客户端的响应码是500,并且也不提示具体原因。查看请求响应消息就会发现cookie设置失败,没有代码中设置的的字段。
不知道为什么response对象设置不了它的编码,必须要单独设置!
URLEncoder.encode(String s, "utf-8");
解码同理。
网友评论