java unicode轉GBK

咱們常常會遇到編碼問題。Java號稱國際化的語言,是由於它的class文件採用UTF-8,而JVM運行時使用UTF-16(至於爲何JVM中要採用UTF-16,我沒看過 相關的資料,但我猜多是由於JAVA裏面一個字符(char)就是16位的,而UTF-16正是雙字節編碼),都是unicode的編碼。java


unicode 的目標就是能支持世界上全部的字符集,也就是說幾乎全部的字符集包含的字符在unicode中都有對應的編碼。在unicode中,字符與代碼的映射關 系,就是unicode字符集,稱爲UCS(Unicode Character Set),每一個unicode字符編碼稱爲code point(代碼點?)。UTF-8和UTF-16是不一樣的UCS編碼方法,UTF就是UCS Transformation Format。;服務器


在Java 中,String的getBytes()方法就是對特定的字符串(unicode)按照給定的字符集進行編碼(encode),new String()則能夠按照某個字符集將字節流轉換回unicode(decode)。Java裏面的每個String都是unicode編碼。編碼


再來看頁面,若是不作特殊處理,Form的提交就按照頁面的ContentType設置中的字符集進行編碼轉換,發送到後臺,後臺必須利用req.setCharacterEncoding來指定參數的編碼格式(不一樣的應用服務器應有不一樣的指定方式),才能正確解碼。spa


Java 裏面的encode和decode都是相對於unicode而言的,encode的意思是將char[] --> XXX Encoding byte[],decode就是由XXX Encoding byte[] --> char[]。日常,當咱們說「將GBK編碼轉換爲UTF-8編碼」的時候,實際的意思就是:GBK Encoding byte[] --> UTF-8 Encoding byte[],這種轉換隻有在須要用byte[]傳輸數據的時候纔有意義,不然即是毫無心義的。3d


首先要說明的一點是:Java中的String對象就是一個unicode編碼的字符串。code


可是,咱們一般會聽到有人說:「咱們須要將String由ISO-8859-1轉換爲GBK編碼」,這又是怎麼回事呢?實際上,咱們並非要「將 一個由ISO-8859-1編碼的String轉換爲GBK編碼的String」,反覆說明的是,JAVA中的String都是unicode編碼的,因此不存在「ISO- 8859-1編碼的String」或「GBK編碼的String」這樣的說法。而須要轉換的惟一的緣由是String進行了錯誤的編碼。咱們常常會碰到由ISO-8859- 1轉換爲諸如GBK/UTF-8等等這樣的需求。所謂的轉換過程是:String --> byte[] -->String。orm


也許 你很是清楚這個過程的代碼:new String(text.getBytes("ISO-8859-1"),"GBK")。可是,要真正理解起來並非那麼簡單。表面上看彷佛很容易理解, 不就是將text String對象按照ISO-8859-1的方式編碼爲byte[]而後再把它按照GBK的方式轉換爲String嗎?可是這句代碼很容易會被誤解爲: 「將text String由ISO-8859-1轉換爲GBK編碼」,這種說法是錯誤的。難道你見過用這樣的代碼:new String(text.getBytes("GBK"),"UTF-8")來對String進行編碼轉換的嗎?對象


之因此你會常常看到new String(text.getBytes("ISO-8859-1"),"GBK")這句代碼,是由於一個GBK的字節流被錯誤地以ISO-8859- 1的方式轉換爲String(unicode)了!發生這種狀況最廣泛的地方是一個GBK編碼的網頁向後臺提交數據的時候,就有可能會看到這句代碼的出 現。GBK的流被錯誤的當成ISO8859-1的流,因此便獲得了一個錯誤的String。因爲ISO8859-1是單字節編碼,因此每一個字節被按照原樣 轉換爲String,也就是說,雖然這是一個錯誤的轉換,但編碼沒有改變,因此咱們仍然有機會把編碼轉換回來!因此那句經典的new String(text.getBytes("ISO-8859-1"),"GBK")便出現了。unicode


若是系統誤覺得是其它編碼格式,就有可能再也轉換不回來了,由於編碼轉換並非負負得正那麼簡單的 字符串


 


public   class   Unicode2GB{   
      public   static   void   main(String[]   arg){   
          String   str   =   "\u53d6";   
          System.out.println(str);   
      }   
  }

 

  輸出自動轉換成GB碼了,非要加個轉換也能夠:   

 

 public   class   Unicode2GB{   
      public   static   void   main(String[]   arg){   
        try{     
          String   str   =   "\u53d6";   
          str   =   new   String(str.getBytes(),"gb2312");   
          System.out.println(str);   
        }catch(java.io.UnsupportedEncodingException   e){   
        }   
      
      }   
  }}
相關文章
相關標籤/搜索