中文乱码解决方案:

数据库乱码:

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
      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 {
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文件中设置编码了

注意:想第二种情况下,不能使用第一种情况下的解决方案,否则会输出”?”

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java数据库