Servlet(四) —— 编码

本文详细介绍了在Servlet中处理中文字符编码的方法,包括响应和请求的编码设置。针对GET和POST请求的不同处理方式,以及URL编码的应用。

Servlet(四) —— 编码

一、常见字符编码:

  • iso-8859-1(不支持中文)
  • gbk(系统默认编码,中国的国标码)
  • UTF-8(万国码,支持全球的编码,我们使用的就是这个)

二、响应编码:

响应:服务器发送给客户端数据!响应是由response对象来完成,如果响应的数据不是字符数据,那么就无需去考虑编码问题。当然,如果响应的数据是字符数据,那么就一定要考虑编码的问题了。

response.getWriter();向客户端发送字符数据时,如果在之前没有设置编码,那么默认使用iso,中文必定乱码,所以在使用response.getWriter()发送数据之前,一定要设置response.getWriter()的编码,这需要使用response.setCharacterEncoding()方法:

response.setCharacterEncoding(“utf-8”);
response.getWriter().print(“汉字”);

我们还需要告诉浏览器要如何读取相应数据,需要使用content-type响应头:

response.setContentType(“text/html;charset=utf-8”);
response.getWriter().print(“汉字”);

注意:

  • response.setContentType();不只是在响应中添加了响应头,还等于调用了一次response.setCharacterEncoding(“utf-8”),也就是说,通过我们只需要调用一次response.setContentType(“text/html;charset=utf-8”)即可,而无需再去调用response.setCharacterEncoding(“utf-8”)了。

  • 在静态页面中,使用来设置content-type响应头,例如:

三、请求编码:

1. 在页面中发出请求:

​ 通常向服务器发送请求数据都需要先请求一个页面,然后用户在页面中输入数据。页面中有超链接和表单,通过超链接和表单就可以向服务器发送数据了。

​ 因为页面是服务器发送到客户端浏览器的,所以这个页面本身的编码由服务器决定。而用户在页面中输入的数据也是由页面本身的编码决定的。

2. GET请求解读编码:

​ 当客户端通过GET请求发送数据给服务器时,使用request.getParameter()获取的数据是被服务器误认为ISO-8859-1编码的,也就是说客户端发送过来的数据无论是UTF-8还是GBK,服务器都认为是ISO-8859-1,这就说明我们需要在使用request.getParameter()获取数据后,再转发成正确的编码。

​ 例如客户端以UTF-8发送的数据,使用如下转码方式:

​ String name =request.getParameter(“name”);

​ name = new String(name.getBytes(“iso-8859-1”), “utf-8”);

3.POST请求解读编码:

​ 当客户端通过POST请求发送数据给服务器时,可以在使用request.getParameter()获取请求参数之前先通过request.setCharacterEncoding()来指定编码,然后再使用reuqest.getParameter()方法来获取请求参数,那么就是用指定的编码来读取了。

​ 也就是说,如果是POST请求,服务器可以指定编码!但如果没有指定编码,那么默认还是使用ISO-8859-1来解读。

request.setCharacterEncoding(“utf-8”);

String name = request.getParameter(“name”);

四、URL编码:

表单类型:Content-Type: application/x-www-form-urlencoded,就是把中文转换成%后面跟随两位的16进制

​ 通过页面传输数据给服务器时,如果包含了一些特殊字符是无法发送的。这时就需要先把要发送的数据转换成URL编码格式,再发送给服务器。

其实需要我们自己动手给数据转换成URL编码的只有GET超链接,因为表单发送数据会默认使用URL编码,也就是说,不用我们自己来编码。

​ 例如:“传智”这两个字通过URL编码后得到的是:“%E4%BC%A0%E6%99%BA”。URL编码是先需要把“传智”转换成字节,例如我们现在使用UTF-8把“传智”转换成字符,得到的结果是:“[-28,-68, -96, -26, -103, -70]”,然后再把所有负数加上256,得到[228, 188, 160, 230, 153, 186],再把每个int值转换成16进制,得到[E4, BC, A0, E6, 99, BA],最后再每个16进制的整数前面加上“%”。

​ 通过URL编码,把“传智”转换成了“%E4%BC%A0%E6%99%BA”,然后发送给服务器!服务器会自动识别出数据是使用URL编码过的,然后会自动把数据转换回来。
当然,在页面中我们不需要自己去通过上面的过程把“传智”转换成“%E4%BC%A0%E6%99%BA”,而是使用Javascript来完成即可。当后面我们学习了JSP后,就不用再使用Javascript了

### Servlet字符编码的设置与处理 在 Servlet 开发中,字符编码是一个常见的问题,尤其是在涉及中文或其他多字节字符集的情况下。以下是关于如何在 Servlet 中设置和处理字符编码的具体方法。 #### 1. 设置 Request 的字符编码 对于 POST 请求,可以通过 `setCharacterEncoding` 方法来指定请求体的编码方式: ```java request.setCharacterEncoding("UTF-8"); ``` 此操作应在读取参数之前执行,否则可能无法正确解析数据[^5]。 而对于 GET 请求,由于其参数通常通过 URL 发送,默认情况下会使用 ISO-8859-1 编码。为了支持 UTF-8 或其他编码格式,可以采取以下措施之一: - 使用 `new String(name.getBytes("ISO-8859-1"), "UTF-8")` 转换编码; - 修改 Tomcat 配置文件中的 `<Connector>` 元素,添加属性 `URIEncoding="UTF-8"` 和/或 `useBodyEncodingForURI="true"`。 #### 2. 设置 Response 的字符编码 Response 对象用于向客户端发送响应内容。要确保浏览器能够正确显示页面上的文字,需完成以下几个步骤: ##### (1) 设置 Content-Type 头部信息 通过调用 `setContentType` 方法定义 MIME 类型以及对应的字符集: ```java response.setContentType("text/html; charset=UTF-8"); ``` ##### (2) 明确写入输出流前设定好编码规则 如果计划利用 `PrintWriter` 输出 HTML 文档,则应先配置好相应的编码环境再获取 Writer 实例: ```java response.setCharacterEncoding("UTF-8"); // 可选但推荐 PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<p>这是测试文本。</p>"); out.println("</body></html>"); out.close(); ``` 注意:调用 `getWriter()` 前最好已经完成了所有的 header 设定工作,包括但不限于 content type 和 character encoding[^1]^。 #### 3. JSP 页面内的编码声明 当开发基于 JSP 技术的应用程序时,除了上述 servlet 层面的操作外,还需要关注 jsp 文件自身的编码情况。具体来说有两个重要的指令需要考虑——`pageEncoding` 和 `contentType`: - **Page Encoding**: 定义了该 .jsp 文件保存的实际物理文件所采用的文字编码方案。 ```jsp <%@ page pageEncoding="UTF-8" %> ``` - **Content Type Charset**: 表明服务器端准备传递给客户机的数据应该按照何种方式进行解码呈现。 ```jsp <%@ page contentType="text/html; charset=UTF-8" %> ``` 这两个值一般建议保持一致以便于维护统一性和减少潜在错误风险[^3]。 --- ### 总结 综上所述,在 Servlet 应用程序中妥善管理字符编码至关重要。这不仅涉及到 server-side 的 request/response 流程控制,还牵涉到前端展示层即 JSP 页面内部的一致性保障。只有做到全方位覆盖才能有效预防可能出现的各种乱码现象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值