1.在所有需要读取数据的地方用下面的方式。同时jsp必须统一编码,如我都是UTF-8
String userName= new String(request.getParameter("userName").getBytes("ISO-8859-1"),"utf-8");
插入数据库的也需要先转换再插入。
上面句子的意思是:把name的值用“ISO-8859-1”字符集获取他的字节,“name.getBytes("ISO-8859-1")”这里面返回的是一个ISO-8859-1的字节数组,最后创建一个String对象,在把它赋值给name;
即就是字符编码转换,把字符集转换成用UTF-8编码的字节码。
ISO-8859-1:是国际字符集之一,比如我们常用的UTF-8和GBK等都是的。
2 上面之所以能解决的原理是:一般浏览器使用的是uTF-8处理字符(可通过网页右击--编码来查看),而WEB容器默认使用ISO-8859-1编码。
这样的话客户端使用UTF-8发送非ASCII字符的请求参数(如果请求参数是ASCII字符,没什么问题,因为都是按一个字节的编码处理,是兼容的,但是中文不同编码方式处理不同),servlet直接使用getParameter()等方法取得该请求参数时就会乱码。
举例,假设网页编码是UTF-8,通过窗体使用post发送“林”这个这个中文字符,相当于浏览器做了这个操作:
String text =java.net.URLEncoder.encode("林" ,“UTF-8”);(编码后为%e6%9e%97)
在Servlet 中取得请求参数时,容器默认使用ISO-8859-1来处理编码,相当于做了这个操作:
String text =java.net.URLEncoder.decode("%e6%9e%97" ,“ISO-8859-1”);自然显示的就不对了。
那该怎么办呢?
下面是servlet的get请求和post请求的不同处理:
jsp文件统一都是UTF-8
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
//get处理编码的方式
String name = req.getParameter("username");
name = new String (name.getBytes("ISO-8859-1"),"UTF-8"); //合在一起就是String name= new String(request.getParameter("username").getBytes("ISO-8859-1"),"utf-8");
.....
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
//post处理编码的方式
req.setCharacterEncoding("UTF-8");
String name = req.getParameter("username");
。。。。
}
2 sql server 2008数据库默认是GBK编码。
查看SQLserver编码格式的SQL语句 :
SELECT COLLATIONPROPERTY('Chinese_PRC_Stroke_CI_AI_KS_WS', 'CodePage')
下面是查询结果:
936 简体中文GBK
950 繁体中文BIG5
437 美国/加拿大英语
932 日文
949 韩文
866 俄文
65001 unicode UFT-8
默认都是936即 简体中文GBK