java 亂碼總結

1、文件亂碼處理 html


1、文件默認編碼:默認使用項目的默認編碼
右擊文件->Properties->Resource->Text file encoding java


2JSP文件編碼:因爲JSP要翻譯爲Servlet mysql


   <%@ page language="java" pageEncoding="utf-8"%> web




2、瀏覽器與服務器傳輸數據亂碼處理 sql


1瀏覽器端編碼,通常由服務器端告訴瀏覽器如何解碼數據: 數據庫


1.1Servlet apache


    response.setContentType("text/html; charset=UTF-8"); 或者  response.setCharacterEncoding(「UTF-8」); 瀏覽器


1.2JSP tomcat


    <%@ page language="java" contentType="text/html; charset=utf-8" %> 服務器


1.3、通用


    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">


1.4Javascript傳參亂碼


在瀏覽器端對要傳遞的中文參數進行編碼處理.代碼以下
       xmlhttp.open("POST",url,true); //請求參數初始化
       xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); //由於請求方式爲POST,因此這裏要設置請求頭.(若是請求方式爲GET,此句代碼能夠省略)
       xmlhttp.send("name="+encodeURI(encodeURI("星期日"))); //向服務器端發送參數
在服務器端代碼:


頁面jsp保證是utf-8編碼


<%@ page contentType="text/html; charset=utf-8"%>


接受中文參數
       PrintWriter out = response.getWriter(); //獲得response的輸出流對象 
       String name1 = request.getParameter("name"); //獲得KEY"name"的請求參數 
       String name = URLDecoder.decode(name1,"utf-8"); //對獲得的參數進行解碼 
       out.print(name); //向瀏覽器端發送數據


1.5熱連接傳參亂碼


在傳參的jsp對中文進行編碼:href="new.jsp?name=java.net.URLEncoder.encode("連接")";


在接受的jsp對中文進行轉碼:String str = URLDecoder.decode(request.getParameter("name "), "utf-8");


注:瀏覽器編碼能夠由咱們手工修改,但最後不要這樣,通常讓瀏覽器自動選擇便可。




2、服務器端編碼,將客戶端傳過來的數據進行解碼: 
瀏覽器默認使用ISO-8859-1進行編碼數據,而後將數據傳輸到服務器,所以咱們默認只須要將瀏覽器發送過來的數據轉換爲咱們須要的編碼便可。


2.1、最簡單方式:


    String username = request.getParameter(「username」);


    username = new String(username.getBytes("ISO-8859-1「), "UTF-8");


2.2、比較好的解決方案
// 
必須在獲取參數以前,調用以下方法先解碼 request.setCharacterEncoding(「UTF-8」);


String username = request.getParameter(「username」);



2.3、比較通用方案:在一個Filter中更改全部請求的編碼方式:


A、在src中添加filter來設置編碼格式是中文,filter類能夠在tomcat的包裏面:apache-tomcat-6.0.16.zip\apache-tomcat-6.0.16\webapps\examples\WEB-INF\classes\filters下面,SetCharacterEncodingFilter.java文件 
B、在web.xml中配置
filter,具體配置以下頁:


<filter>

       <filter-name>Set Character Encoding</filter-name>

        <filter-class>filters.SetCharacterEncodingFilter</filter-class>

        <init-param><param-name>encoding</param-name>

       <param-value>utf-8</param-value></init-param>

</filter>

<filter-mapping>

        <filter-name>Set Character Encoding</filter-name>

        <url-pattern>/*</url-pattern>

</filter-mapping>


2.4GET提交方式中文亂碼解決


經過修改request.setCharacterEncoding(「UTF-8」);只能解決POST提交方式的請求編碼,對GET無效。


A、最簡單解決方案:
解決方案再也不須要任何額外配置(如filter) TOMCAT默認ISO-8859-1 所以能夠設置默認編碼爲UTF-8解決,在conf\server.xml文件中設置以下 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding=」UTF-8」/>


B、在tomcat4以後,能夠經過以下配置來解決中文亂碼,但必須配置filter 
在conf\server.xml文件中設置以下 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI=「true」/> 
而後request.setCharacterEncoding(「UTF-8」)也可解決GET亂碼


3Java與數據庫之間的亂碼:
  大部分數據庫都支持以unicode編碼方式,因此解決Java與數據庫之間的亂碼問題比較明智的方式是直接使用unicode編碼與數據庫交互。不少數據庫驅動自動支持unicode,如Microsoft的SQLServer驅動。其餘大部分數據庫驅動,能夠在驅動的url參數中指定,如mysql驅動:

jdbc:mysql://localhost/MYAPPS?useUnicode=true&characterEncoding=GBK


或者使用JAVA程序,修改編碼,程序以下:


public class Convert {

  public static String ISOtoGB(String iso){
  String gb;
  try{
    if(iso.equals("") || iso == null){
      return "";
    }
    else{
      iso = iso.trim();
      gb = new String(iso.getBytes("ISO-8859-1"),"GB2312");
      return gb;
    }
  }
  catch(Exception e){
    System.err.print("
編碼轉換錯誤:"+e.getMessage());
    return "";
    }
  }
}


4Java與文件/流之間的亂碼:
  Java讀寫文件最經常使用的類是FileInputStream / FileOutputStream和FileReader / FileWriter。其中FileInputStream和FileOutputStream是基於字節流的,經常使用於讀寫二進制文件。讀寫字符文件建議使用基於字符的FileReader和FileWriter,省去了字節與字符之間的轉換。但這兩個類的構造函數默認使用系統的編碼方式,若是文件內容與系統編碼方式不一致,可能會出現亂碼。在這種狀況下,建議使用FileReader和FileWriter的父類:InputStreamReader / OutputStreamWriter,它們也是基於字符的,但在構造函數中能夠指定編碼類型:InputStreamReader(InputStream in, Charset cs) 和OutputStreamWriter(OutputStream out, Charset cs)。

相關文章
相關標籤/搜索