`

java 中文乱码

阅读更多
解析Java中文乱码的处理方法

我写这个不是讲解中英文之间的差距,解码等,我是将我在这几年工作遇到各种各样的乱码的解决方法,总结起来,也希望大家能把自己晕倒解决乱码的方法都说出来,咱们弄一个解决乱码的“葵花宝典”。

对于Java,由于默认的编码方式是UNICODE,所以用中文也易出问题,常见的解决是:

String s2 = new String(s1.getBytes(“ISO-8859-1”),”GBK”);



1、utf8解决JSP中文乱码问题

一般说来在每个页面的开始处,加入:

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%request.setCharacterEncoding("UTF-8");%>



◆charset=UTF-8的作用是指定JSP向客户端输出的编码方式为“UTF-8”;
◆pageEncoding="UTF-8",为了让JSP引擎能正确地解码含有中文字符的JSP页面,这在LINUX中很有效;
◆request.setCharacterEncoding("UTF-8");是对请求进行了中文编码。


有时,这样仍不能解决问题,还需要这样处理一下:

String msg = request.getParameter("message"); String str=new String(msg.getBytes("ISO-8859-1"),"UTF-8"); out.println(st);



2、Tomcat 5.5中文乱码

只要把%TOMCAT安装目录%/   webapps\servlets-examples\WEB-INF\classes\filters\SetCharacterEncodingFilter.class文件拷到你的webapp目录/filters下,如果没有filters目录,就创建一个。  

2)在你的web.xml里加入如下几行:

  <filter>   <filter-name>Set   Character   Encoding</filter-name>   <filter-class>filters.SetCharacterEncodingFilter</filter-class>   <init-param>   <param-name>encoding</param-name>   <param-value>GBK</param-value>   </init-param>   </filter>   <filter-mapping>   <filter-name>Set   Character   Encoding</filter-name>   <url-pattern>/*</url-pattern>   </filter-mapping>



3)完成

2、get方式的解决办法

1)打开tomcat的server.xml文件,找到区块,加入如下一行:  

  URIEncoding=”GBK”



完整的应如下:

    port="80"   maxThreads="150"   minSpareThreads="25"   maxSpareThreads="75"     enableLookups="false"   redirectPort="8443"   acceptCount="100"     debug="0"   connectionTimeout="20000"       disableUploadTimeout="true"       URIEncoding="GBK"     />



2)重启tomcat,一切OK。

3、xmlHttpRequest中文问题

页面jsp用的GBK编码

代码:

<%@ page contentType="text/html; charset=GBK"%>

javascript部分

代码:

function addFracasReport() {       var url="controler?actionId=0_06_03_01&actionFlag=0010";       var urlmsg="&reportId="+fracasReport1.textReportId.value;  //故障报告表编号                  var xmlHttp=Common.createXMLHttpRequest();       xmlHttp.onreadystatechange = Common.getReadyStateHandler(xmlHttp,        eval("turnAnalyPage"));       xmlHttp.open("POST",url,true);       xmlHttp.setRequestHeader( " Content-Type " , "        application/x-www-form-urlencoded);       xmlHttp.send(urlmsg);          }



#p#

后台java中获得的reportId是乱码,不知道该怎么转,主要是不知道xmlHttp.send(urlmsg);以后是什么编码?在后面用java来转,试了几种,都没有成功,其中有:

代码:

public static String UTF_8ToGBK(String str) {           try {               return new String(str.getBytes("UTF-8"), "GBK");           } catch (Exception ex) {               return null;           }       }              public static String UTF8ToGBK(String str) {           try {               return new String(str.getBytes("UTF-16BE"), "GBK");           } catch (Exception ex) {               return null;           }       }              public static String GBK(String str) {           try {               return new String(str.getBytes("GBK"),"GBK");           } catch (Exception ex) {               return null;           }       }            public static String getStr(String str) {           try {               String temp_p = str;               String temp = new String(temp_p.getBytes("ISO8859_1"), "GBK");               temp = sqlStrchop(temp);               return temp;           } catch (Exception e) {               return null;           }       }



4、JDBC ODBC Bridge的Bug及其解决方法

在编写一数据库管理程序时,发现JDBC-ODBC Bridge存在不易发现的Bug。在向数据表插入数据时,如果为英文字符,存储内容完全正确,如果存入中文字符,部分数据库只能存储前七八个中文字符,其他内容被截去,导致存储内容的不完整(有些数据库不存在这个问题,如Sybase SQL Anywhere 5.0。JDBC-ODBC Bridge还存在无法建表的Bug)。

对于广大需要存储中文信息的Java程序员来说,这可是一个不好的消息。要么改用其他语言编程,要么选择其他价格昂贵的数据库产品。“一次编写,到处运行”的目标,也大打折扣。能不能采用变通的方法,将中文信息进行处理后再存储来解决这个问题呢?答案是肯定的。

解决问题的具体思路、方法
  
Java采用Unicode码编码方式,中英文字符均采用16bit存储。既然存储英文信息是正确的,根据一定规则,将中文信息转换成英文信息后存储,自然不会出现截尾现象。读取信息时再进行逆向操作,将英文信息还原成中文信息即可。由GB2312编码规则可知,汉字一般为二个高位为1的ASCII码,在转换时将一个汉字的二个高位1去掉,还原时再将二个高位1加上。为了处理含有英文字符的中文字串,对英文字符则需要加上一个Byte 0标记。以下提供的两个公用静态方法,可加入任何一个类中使用。

将中英文字串转换成纯英文字串

  public static String toTureAsciiStr(String str){   StringBuffer sb = new StringBuffer();   byte[] bt = str.getBytes();   for(int i =0 ;i〈bt.length;i++){   if(bt[i]〈0){   //是汉字去高位1   sb.append((char)(bt[i]&&0x7f));    }else{//是英文字符 补0作记录   sb.append((char)0);   sb.append((char)bt[i]);    }    }   return sb.toString();   }



将经转换的字串还原

  public static String unToTrueAsciiStr(String str){    byte[] bt = str.getBytes();    int i,l=0,length = bt.length,j=0;    for(i = 0;i〈length;i++){    if(bt[i] == 0){    l++;    }    }    byte []bt2 = new byte[length-l];    for(i =0 ;i〈length;i++){    if(bt[i] == 0){    i++;    bt2[j] = bt[i];    }else{    bt2[j] = (byte)(bt[i]|0x80);    }    j++;    }   String tt = new String(bt2);   return tt;   }



上例在实际编程中效果很好,只是存储的中文信息需要经过同样处理,才能被其他系统使用。而且如果中文字串出现英文字符,实际上增加了额外的存储空间。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics