解決中文亂碼問題

    
    瞭解編碼


    1,Unicode編碼又稱統一碼、萬國碼、單一碼,它是業界的一種標準,是爲了解決傳統的字符編碼方案的侷限而產生的,存在很多幾種實現方式如:UTF-8、UTF-16等.
    
    2,UTF-8 是在互聯網上使用最廣的一種unicode的實現方式。可以使用1~4個字節表示一個符號,根據不同的符號而變化字節長度。
    
    3,在 ASCII 編碼中,一個英文字母字符存儲需要1個字節。在 GB 2312 編碼或 GBK 編碼中,一個漢字字符存儲需要2個字節。
        在UTF-8編碼中,一個英文字母字符存儲需要1個字節,一個漢字字符儲存需要3到4個字節。
        在UTF-16編碼中,一個英文字母字符或一個漢字字符存儲都需要2個字節(Unicode擴展區的一些漢字存儲需要4個字節)。
        在UTF-32編碼中,世界上任何字符的存儲都需要4個字節。
        
    4,GBK是GB2312的擴展,他向下與GB2312兼容,,向上支持 ISO 10646.1 國際標準        
    


    中文亂碼大多數都是因爲編碼和解碼的不一致造成的,所以我們可以從5個方面入手:1, JAVA 2, JAVA WEB 3, JAVA JSP 4, JAVASCRIPTE 5, TOMCAT


    
    理解java是如何來編碼和被解碼的


    
    第一步:當我們用編輯器編寫java源文件,程序文件在保存時會採用操作系統默認的編碼格式(一般我們中文的操作系統採用的是GBK編碼格式)形成一個.java文件。java源文件是採用操作系統默認支持的file.encoding編碼格式保存的。下面代碼可以查看系統的file.encoding參數值。

    

System.out.println(System.getProperty("file.encoding"));


    第二步:當我們使用javac.exe編譯我們的java文件時,JDK首先會確認它的編譯參數encoding來確定源代碼字符集,如果我們不指定該編譯參數,JDK首先會獲取操作系統默認的file.encoding參數,然後JDK就會把我們編寫的java源程序從file.encoding編碼格式轉化爲JAVA內部默認的UNICODE格式放入內存中。

    第三步:JDK將上面編譯好的且保存在內存中信息寫入class文件中,形成.class文件。此時.class文件是Unicode編碼的,也就是說我們常見的.class文件中的內容無論是中文字符還是英文字符,他們都已經轉換爲Unicode編碼格式了。
    
    
    注意點:使用IO流時,若不指定編碼格式時,默認的編碼格式都是 系統編碼 。因此若輸入指定了編碼格式,那麼輸入也要指定與輸入一樣的編碼格式。
    


    理解JAVA WEB 編碼


    1,不同瀏覽器編碼格式:
    Firefox、chrome、IE都是採用UTF-8編碼格式,對於Query String部分Firefox、chrome採用UTF-8,IE採用GBK。至於爲什麼會加上%,這是因爲URL的編碼規範規定瀏覽器將ASCII字符非 ASCII 字符按照某種編碼格式編碼成 16 進制數字然後將每個 16 進製表示的字節前加上“%”。
    
   2, URL 是在 org.apache.coyote.HTTP11.InternalInputBuffer 的 parseRequestLine 方法中. 對URI的解碼操作是首先獲取Connector的解碼集,該配置在server.xml中,如果沒有定義則會採用默認編碼ISO-8859-1來解析。
    


    理解JAVA JSP頁面編碼過程


    
    JSP轉換爲servlet過程中下面一段代碼爲設置頁面編碼格式。

    

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>


    
    上面代碼中有兩個地方存在編碼:pageEncoding、contentType的charset。其中pageEncoding是jsp文件本身的編碼,而contentType的charset是指服務器發送給客戶端時的內容編碼。
    


    理解javascript編碼的三個方法:escape()、encodeURI()、encodeURIComponent()


    
    1,escape:採用SIO Latin字符集對指定的字符串進行編碼。所有非ASCII字符都會被編碼爲%xx格式的字符串,其中xx表示該字符在字符集中所對應的16進制數字。


    2,encodeURI :對整個URL進行編碼,它採用的是UTF-8格式輸出編碼後的字符串。不過encodeURI除了ASCII編碼外對於一些特殊的字符也不會進行編碼如:! @ # $& * ( ) = : / ; ? + ‘。


   3, encodeURIComponent:把URI字符串採用UTF-8編碼格式轉化成escape格式的字符串。相對於encodeURI,encodeURIComponent會更加強大,它會對那些在encodeURI()中不被編碼的符號(; / ? : @ & = + $ , #)統統會被編碼。但是encodeURIComponent只會對URL的組成部分進行個別編碼,而不用於對整個URL進行編碼。

 

    理解TOMCAT編碼


    tomcat服務器使用的是ISO-8859-1編碼格式來編碼的,以我們只需要在tomcat的server.xml文件的<Connector>標籤中加上URIEncoding=”utf-8″即可。

發佈了10 篇原創文章 · 獲贊 4 · 訪問量 9036
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章