java数据库等——乱码问题解决办法

中文乱码解决方案:

数据库乱码:

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编码就成了3UCS2编码格式的字符,因此,就会持续乱码。既然知道了原理,那就非常容易解决了。只需要将这些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文件中设置编码了

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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值