问题
在我们通过JavaWeb写登录注册页面时,初学者总会遇到一个细节问题,那就是字符编码问题。(由于写Java的创始人并不是中国人,所以默认不是utf-8编码,所以我们需要将编码转换为utf-8字符集),因此我总结了两个角度来处理编码问题,希望能为大家带来帮助。
角度一(接收数据时处理)
如下图为注册表单的处理代码(jsp代码)
本代码造成了以下后果(即接收到的中文数据为乱码,导致添加到数据库中的中文数据为也乱码)
追其根源,问题出在了下边这段代码
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");
角度二(保存数据时处理)
同样的问题我们还可以在数据库添加数据前处理,这样做的好处不过是只处理添加到数据库的中文数据,其他不符合添加数据库要求的数据不必处理。
问题突破口在如下代码上
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问题分享就先到这里,希望能够给读者带来帮助,谢谢阅读,愿我们都能在知识的海洋里不断遨游并寻到自己心中的那块新大陆!