问题

在我们通过JavaWeb写登录注册页面时,初学者总会遇到一个细节问题,那就是字符编码问题。(由于写Java的创始人并不是中国人,所以默认不是utf-8编码,所以我们需要将编码转换为utf-8字符集),因此我总结了两个角度来处理编码问题,希望能为大家带来帮助。

角度一(接收数据时处理)

如下图为注册表单的处理代码(jsp代码)

java 表单中可以嵌套表单吗 javaweb表单数据处理_tomcat


本代码造成了以下后果(即接收到的中文数据为乱码,导致添加到数据库中的中文数据为也乱码)

java 表单中可以嵌套表单吗 javaweb表单数据处理_数据_02


追其根源,问题出在了下边这段代码

String name = request.getParameter("name");

1.错误原因

Http请求传输时将url以ISO-8859-1编码,服务器收到字节流后默认会以ISO-8859-1编码来解码成字符流(造成中文乱码)

2.解决方法

把request.getParameter(“参数名”)获取到的字符串先用ISO-8859-1编码成字节流,然后再将其用utf-8解码成字符流,只需将上边的问题代码修改为以下代码

String name = new String(request.getParameter("name").getBytes("iso-8859-1"), "utf-8");

角度二(保存数据时处理)

同样的问题我们还可以在数据库添加数据前处理,这样做的好处不过是只处理添加到数据库的中文数据,其他不符合添加数据库要求的数据不必处理。

java 表单中可以嵌套表单吗 javaweb表单数据处理_数据_03


问题突破口在如下代码上

String URL = "jdbc:mysql://localhost:3306/mengze";

解决方法

通过转码的方式处理乱码问题

String URL = "jdbc:mysql://localhost:3306/mengze?useUnicode=true&characterEncoding=utf-8";

也可通过修改Tomcat配置文件,设置URL编码集(URIEncoding)设置编码,这种方法也是一劳永逸的,这里需要修改Tomcat/conf 目录下 的server.xml文件

<Connector URIEncoding="UTF-8" acceptCount="1500" connectionTimeout="20000" enableLookups="false" maxSpareThreads="100" maxThreads="1000" minSpareThreads="25" port="9082" protocol="HTTP/1.1" useBodyEncodingForURI="true"/>

重点在 userBodyEncodingForURI 和 URIEncoding 这两个属性
下面来解释一下这两个属性的意义

useBodyEncodingForURI参数: 表示是否用request.setCharacterEncoding参数对URL提交的数据和表单中GET方式提交的数据进行重新编码,在默认情况下,该参数为false。
URIEncoding参数: 指定对所有GET方式请求进行统一的重新编码(解码)的编码。

URIEncoding和useBodyEncodingForURI区别是

URIEncoding是对所有GET方式的请求的数据进行统一的重新编码,
useBodyEncodingForURI则是根据响应该请求的页面的request.setCharacterEncoding参数对数据进行的重新编码,不同的页面可以有不同的重新编码的编码。

Ending

本次JavaWeb问题分享就先到这里,希望能够给读者带来帮助,谢谢阅读,愿我们都能在知识的海洋里不断遨游并寻到自己心中的那块新大陆!