web项目中经常遇到中文乱码问题,本文简单记录遇到中文乱码问题时的解决方案,代码如下:
<form class="form-horizontal" role="form" action="${pageContext.request.contextPath}/addProductType.do" >
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
<h4 class="modal-title" id="proAddLabel">产品类型添加</h4>
</div>
<div class="modal-body">
<div class="form-group">
<label for="productName4Add" class="col-lg-2 control-label">类型名称</label>
<div class="col-lg-10">
<input type="text" class="form-control" id="productName4Add" name = "productTypeName" placeholder="类型名称">
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
<input type="submit" class="btn btn-primary" value="添加" />
</div>
</form>
我们可以看到这是一段典型的form表单提交的代码,在后台中我们通过request请求获取输入框内的值,这时输入中文字符后出现乱码。(在查找问题之前,先确保eclipse的字符集和jsp页面的字符编码均为utf-8)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
eclipse检查方式window>preferences>General>Workspace。
确保无误后进行下面的操作,我们首先想到的是在通过request对象获取参数前,设置utf-8编码
request.setCharacterEncoding("utf-8");
String typeName=request.getParameter("productTypeName");
尝试后乱码问题依然存在,随后在form表单中加上method="post"后问题解决。<form class="form-horizontal" role="form" action="${pageContext.request.contextPath}/addProductType.do" method="post">
问题总结如下:
先前form表单中没有设置提交请求的方式,默认为get请求,使用get请求时,请求参数回被附加在url地址后并传给服务器,tomcat会先自动解析get请求传送过来的url字符
串(暂时先这么理解,后续有进一步了解后会对本片进行更新),而tomcat对网络请求处理时的默认字符集是ISO8859-1,这种情况下必定是会出现乱码的。
当form表单提交请求方式为post时,在获取request中的参数前加上request.setCharacterEncoding("utf-8")可以有效解决乱码问题。
request.setCharacterEncoding("utf-8");
String typeName=request.getParameter("productTypeName");
那么对于get请求,我们如何避免中文字符乱码呢?我们可以在tomcat的配置文件中进行字符编码的修改,tomcat安装目录>conf>server.xml中找到下面这行标签
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
在这个标签中加上URIEcoding="UTF-8"即修改默认字符编码为utf-8。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEcoding="UTF-8" />
除了上述方法,还可以吧原有的参数拆分成byte数组后再通过该数组生成指定编码的String,这是一个万能的方法
String productTypeName=request.getParameter("productTypeName");
byte[] bytes=str.getBytes("ISO-8859-1");
productTypeName=newString(bytes,"utf-8");