中文乱码解决方案:
数据库乱码:
UTF-8对中文用3个字节来表示
String s =”飞翔”;
byte[] utf8 = s.getBytes(“utf-8”);//获得utf-8编码的字节值
System….(new String(utf8,”gbk”);//用GBK编码格式对UTF-8编码格式的字节数组进行解码,将产生乱码。
查看数据库的字符集
show variables like 'character/_set/_%';
show variables like 'collation_%';
--设置数据库字符编码
set names 'GBK'
alter database payment character set GBK;
create database mydb character set GBK;
set character_set_client=gbk;
set character_set_connection=gbk;
set character_set_database=gbk;
set character_set_results=gbk;
set character_set_server=gbk;
set character_set_system=gbk;
set collation_connection=gbk;
set collation_database=gbk;
set collation_server=gbk;
Servlet解决服务器端传给客户端产生的乱码问题
添加GB2312编码
向服务器输出中文时出现乱码或“?”最常用的解决方案:
service(HttpServletRequest request,HttpServletResponse response){
String s =” 中文”;
response.setContentType(“text/html;charset=utf-8”);
PrintWriter out = response.getWriter();
out.println(s);
}
以上方法有时候会失灵,所以使用下面试试:
service(){
String s = “中文”;
PrintWriter out = response.getWriter();
response.setHeader(“Content-Type”,”text/html;charset=utf-8”);//设置Conten-Type响应头
out.println(new String(s.getByte(“utf-8”),”iso-8859-1”));
}//获得utf-8编码的字节数组后,将其按原样保存在String对象中
}
1struts:
String name =request.getParameter("username");
String username;
try {
username=new String(request.getParameter("username").getBytes("ISO-8859-1"), "gb2312" );
username = new String(username.getBytes(“ISO8859-1”),”GBK”);
2 struts2
HttpServletRequest request=ServletActionContext.getRequest();String
str=new String(request.getParameter("subName").getBytes("ISO-8859-1"),"GB2312");
解决服务器端程序读取中文消息乱码问题:
l 客户端传来的数据要进过HTTP协议解析,解析的时候使用URLEncoding方式编码,所以在服务器端需要解码,方式:
String s =”%E9%A3%9E%E7%BF%94”://包含URL编码的字符串
Sys…(java.net.URLDecoder.decode(s,”utf-8”));//使用utf-8字符集编码对该字符串解码,
但是tomcat在内部自动完成了这一步,就是当开发人员通过getParameter方法获得name参数值是,tomcat已经使用decode方法对请求的参数惊醒转换了。因此这里就会产生一个问题,Tomcat并不知道要使用utf-8编码格式进行转换,而decode方法的第二个参数需要一个知道的编码格式。那么tomcat又是根据什么编码格式进行编码转换的呢?实际上,在默认情况下,tomcat是使用iso-8859-1编码格式进行转换的,如果按照iso-8859-1进行编码,就相当于直接将字节存放到String变量中,不做任何转换。如下面代码所示:String s=” %E9%A3%9E%E7%BF%94”;
String s = URLDecoder.decode(s,”iso-8859-1”);
Sy…(s);
上面的代码中的s变量所对应的字节仍然是“E1 A3…”,由于java内部使用的是UCS2编码,但现在s变量里保存的是UTF-8,更糟糕的是,java把这些编码当成了ucs2编码来解析了,也就是说,对于java来说,这个6个字节的utf-8编码就成了3个UCS2编码格式的字符,因此,就会持续乱码。既然知道了原理,那就非常容易解决了。只需要将这些UTF-8编码再转换成UCS2编码保存在s变量中即可,如下:
String s1=" %E9%A3%9E%E7%BF%94";
try {
String s2 = URLDecoder.decode(s1,"iso8859-1");
System.out.println(new String(s2.getBytes("iso8859-1"),"utf-8")+"=====================");
} catch (UnsupportedEncodingException e) {
// XXX Auto-generated catch block
e.printStackTrace();
}
在tomcat下设置编码:
在默认情况下,tomcat是使用iso8859-1进行编码的,但是如果修改了这个默认值,就可以直接输出中文了。有了这种解决方案,就不能使用以上解决方案了。
在<Connector port=”8080 protocol=”HTTP/1.1“。。。20000 8443。
URIEncoding=”UTF-8”/>//这样设置之后不需要在java文件中设置编码了
注意:想第二种情况下,不能使用第一种情况下的解决方案,否则会输出”?”