1. 程式人生 > >java字元轉碼

java字元轉碼

java虛擬機器預設的編碼是unicode指的是記憶體中的編碼是unicode,而進行io(包括網路和硬碟)傳輸時另外編碼,通過 System.getProperty("file.encoding")檢視,通常,預設為ansi,不過通過eclipse可以配置為其他編碼,記為charSet;當以reader或者writer方式讀寫時,會自動按照配置的方式轉換成unicode,而當以stream的方式讀寫時,不會轉換,因此,如果硬碟上的字元如果不是以charSet儲存,則出現亂碼。 記憶體中編碼轉換方法: string.getByte("gbk");把記憶體中的unicode字元轉換成gbk位元組 new String(byte[],"utf-8");報byte中的位元組按照utf-8進行解碼,轉換成unicode 與檔案互動轉換方法: BufferedReader br=new BufferedReader(ner InputStreamReader(new FileInputStream(path),charSet)); charSet值的就是檔案儲存的字符集,最好通過System.getProperty(file.encoding獲得); writer類似; 對於傳送資料,伺服器按照response.setCharacterEncoding—contentType—pageEncoding的優先順序,對要傳送的資料進行編碼。 不同的國家和地區制定了不同的標準,由此產生了 GB2312, BIG5, JIS 等各自的編碼標準。這些使用 2 個位元組來代表一個字元的各種漢字延伸編碼方式,稱為 ANSI 編碼。在簡體中文系統下,ANSI 編碼代表 GB2312 編碼,在日文作業系統下,ANSI 編碼代表 JIS 編碼。 漢字區位碼和unicode是規定怎麼表示文字的,漢字內碼和UTF是規定怎麼(在硬碟)儲存和傳送文字的,後者是前者的實際實現方式,ucnicode也可以儲存字元,但比較佔空間。 url編碼就是一個字元ascii碼的十六進位制。不過在每個位元組前面加上了"%";其中多位元組字元由於最高位是1,因此它要先被轉成UTF-8 當一個軟體開啟一個文字時,它要做的第一件事是決定這個文字究竟是使用哪種字符集的哪種編碼儲存的。 開頭位元組 Charset/encoding(即BOM),如下表: EF BB BF           UTF-8 FE FF                UTF-16/UCS-2, little endian FF FE                UTF-16/UCS-2, big endian FF FE 00 00       UTF-32/UCS-4, little endian. 00 00 FE FF       UTF-32/UCS-4, big-endian.  big endian更接近人類思考,但x86採用的是little endian,即在暫存器中是得位元組在前,便於cpu讀寫 ***************************************************************************************************** unicode: 有兩套標準: UCS-2(Unicode-16)用2個位元組為字元編碼 UCS-4(Unicode-32)用4個位元組為字元編碼。 但是0xFFFF以上的字元尚未定義,因此目前說unicode主要指ucs-2(bmp) UTF意為Unicode文字格式。對於UTF,是這樣定義的: (1)0x0000到0x007F (前9位0,ascii)則用1個位元組表示,這個位元組的首位是“0”,剩下的7位與原字元中的後7位相同 (2)0x0080到x07FF (前5位0 )則用2個位元組表示,首位元組“110”開頭,後5位與原編碼除去5個零後的高5位同;次位元組以“10”開頭,後6位與原編碼的低6位相同 (3)0x0800到0xFFFF    則用三個位元組表示。首節以 “1110”開頭,後4位為原編碼的高4位;第二個位元組以“10”開頭,後6位為原編碼中間的6位;第三個位元組以“10”開頭,後6位為原編碼的低6位; 簡化如下:ASCII字母繼續使用1位元組儲存,重音文字、希臘字母或西裡爾字母等使用2位元組來儲存,而常用的漢字就要使用3位元組。輔助平面字元則使用4位元組。 或: 1. 對英文,仍然和ASCII一樣用1個位元組表示,這個位元組的值小於128(\x80); 2. 對其他語言的用一個值位於128-256之間的位元組開始,再加後面緊跟的2個位元組表示,一個字元一共是3個位元組; ************************************************************************************** ISO-8859-n系列都是單位元組字元,不同的n表示擴充套件不同型別的字母,比如其他西歐字母,希臘字母等 ISO-8859-1:理解為ascii的擴充套件,容納256種字元,以位元組為單位,解釋時,每個位元組直接加上8位0就變成相應的Unicode字元。解釋gbk中文時,要拆分成兩個位元組,就變成兩個Unicode,出現亂碼。 GB2312:區位碼+0xA0得到。“高位位元組”使用了0xA1-0xF7(把0x01-0x57區的區號加上0xA0),“低位位元組”使用了0xA1-0xFE(把0x01-0x5E加上0xA0)。 GB2312 支援的漢字太少。1995年的漢字擴充套件規範GBK1.0收錄了21886個符號,它分為漢字區和圖形符號區。漢字區包括21003個字元。2000年的 GB18030是取代GBK1.0的正式國家標準。該標準收錄了27484個漢字 狹義的ascii指1-127之間的字元,廣義的ascii指的是iso-8859-1 **************************************************************************** 在java中,記憶體中字串以unicode儲存,因此對於讀取檔案得到的java字元亂碼,可先通過byte[] b=str.getByte("iso-8859-1");還原成"iso-8851",即ascii,然後通過new String(b,"gbk");即可得到完整的unicode字串。 當頁面中的表單提交字串時,首先把字串按照當前頁面的編碼,轉化成位元組串。然後再將每個位元組轉化成 "%XX" 的格式提交到 Web 伺服器。比如,一個編碼為 GB2312 的頁面,提交 "中" 這個字串時,提交給伺服器的內容為 "%D6%D0"。 在伺服器端,Web 伺服器把收到的 "%D6%D0" 轉化成 [0xD6, 0xD0] 兩個位元組,即當提交 "%D6%D0" 給 Tomcat 伺服器時,request.getParameter() 將返回 [0x00D6, 0x00D0] 兩個 UNICODE 字元,而不是返回一個 "中" 字元。因此,我們需要使用 bytes = string.getBytes("iso-8859-1") 得到原始的位元組串,再用 string = new String(bytes, "GB2312") 重新得到正確的字串 "中"。 <%@ page pageEncoding="GB2312%>指的是本頁面將要在硬碟中儲存的格式,如果為iso-8859-1而且文中有中文,由於eclipse記憶體中是unicode編碼,所以暫時顯示,但是儲存時要儲存成iso-8859-1,則會提示格式錯誤. <%@ page contentType="txt/heml/charset=gb2312"%>指的是當本文件顯示到使用者瀏覽器上時,以那種編碼顯示。如果使用者看到亂碼,說明使用者瀏覽器的設定解碼方式和這個值不符。 在xx_jsp.java中,這句話被翻譯成response.setContentType("text/html;charset=gb2312"); <%@request.setCharacterEncoding("text/html;charset=gb2312")%>;注意是request,他的作用是通知伺服器本頁面傳遞的引數要用gb2312解碼。 在servlet中: request.setCharacterEncoding("gb2312");表示要用此方式解析使用者傳過來的變數,注意,要和<%@request.setCharacterEncoding("text/html;charset=gb2312")%>對應。 response.setContentType("text/html;charset=gb2312");表示想瀏覽器迴應時的編碼方式,和<%@ page contentType="txt/heml/charset=gb2312"%>的作用相同。
轉碼流程:檔案(gbk)-->解碼-->編碼--->檔案(utf-8)

注:如有問題請留言

下面具體的例項

方法一:java.lang.String

Java程式碼  收藏程式碼
  1. 用於解碼的構造器:  
  2. String(byte[] bytes, int offset, int length, String charsetName)   
  3. String(byte[] bytes, String charsetName)   
  4. 用於編碼的方法:  
  5. byte[] getBytes(String charsetName)  //使用指定字符集進行編碼
      
  6.  byte[] getBytes() //使用系統預設字符集進行編碼  
Java.lang.string轉碼程式碼  收藏程式碼
  1. public void convertionString() throws UnsupportedEncodingException{  
  2.         String s = "清山";  
  3.         byte[] b = s.getBytes("gbk");//編碼  
  4.         String sa = new String(b, "gbk");//解碼:用什麼字符集編碼就用什麼字符集解碼  
  5.         System.out.println(sa);  
  6.         b = sa.getBytes("utf-8");//編碼  
  7.         sa = new String(b, "utf-8");//解碼  
  8.         System.err.println(sa);  
  9.     }  

方法二:java.io.InputStreamReader/OutputStreamWriter:橋轉換

Java程式碼  收藏程式碼
  1. package com.qingshan.io;  
  2. import java.io.FileInputStream;  
  3. import java.io.FileOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.InputStreamReader;  
  7. import java.io.OutputStream;  
  8. import java.io.OutputStreamWriter;  
  9. import java.io.UnsupportedEncodingException;  
  10. /** 
  11.  * <pre> 
  12.  * 使用java.io橋轉換:對檔案進行轉碼 
  13.  * </pre> 
  14.  * <hr Color="green" ></hr>  
  15.  * 2012 Qingshan Group 版權所有 
  16.  * <hr Color="green" ></hr>  
  17.  * @author  thetopofqingshan 
  18.  * @version 1.0.0 
  19.  * @since   JDK 1.5 
  20.  * @date    2012-4-28 
  21.  */  
  22. public class CharsetConvertion {  
  23.     private FileInputStream fis;// 檔案輸入流:讀取檔案中內容  
  24.     private InputStream is;  
  25.     private InputStreamReader isr;  
  26.     private OutputStream os;  
  27.     private OutputStreamWriter osw;//寫入  
  28.     private char[] ch = new char[1024];  
  29.     public  void convertionFile() throws IOException{  
  30.         is = new FileInputStream("C:/專案進度跟蹤.txt");//檔案讀取  
  31.         isr = new InputStreamReader(is, "gbk");//解碼  
  32.         os = new FileOutputStream("C:/專案進度跟蹤_utf-8.txt");//檔案輸出  
  33.         osw = new OutputStreamWriter(os, "utf-8");//開始編碼  
  34.         char[] c = new char[1024];//緩衝  
  35.         int length = 0;  
  36.         while(true){  
  37.             length = isr.read(c);  
  38.             if(length == -1){  
  39.                 break;  
  40.             }  
  41.             System.out.println(new String(c, 0, length));  
  42.             osw.write(c, 0, length);  
  43.             osw.flush();  
  44.         }  
  45.     }  
  46.     public void convertionString() throws UnsupportedEncodingException{  
  47.         String s = "清山集團";  
  48.         byte[] b = s.getBytes("gbk");//編碼  
  49.         String sa = new String(b, "gbk");//解碼:用什麼字符集編碼就用什麼字符集解碼  
  50.         System.out.println(sa);  
  51.         b = sa.getBytes("utf-8");//編碼  
  52.         sa = new String(b, "utf-8");//解碼  
  53.         System.err.println(sa);  
  54.     }  
  55.     /** 
  56.      * <pre> 
  57.      * 關閉所有流 
  58.      * </pre> 
  59.      * 
  60.      */  
  61.     public void close(){  
  62.         if(isr != null){  
  63.             try {  
  64.                 isr.close();  
  65.             } catch (IOException e) {  
  66.                 e.printStackTrace();  
  67.             }  
  68.         }  
  69.         if(is != null){  
  70.             try {  
  71.                 is.close();  
  72.             } catch (IOException e) {  
  73.                 // TODO Auto-generated catch block  
  74.                 e.printStackTrace();  
  75.             }  
  76.         }  
  77.         if(osw != null){  
  78.             try {  
  79.                 osw.close();  
  80.             } catch (IOException e) {  
  81.                 // TODO Auto-generated catch block  
  82.                 e.printStackTrace();  
  83.             }  
  84.         }  
  85.         if(os != null){  
  86.             try {  
  87.                 os.close();  
  88.             } catch (IOException e) {  
  89.                 // TODO Auto-generated catch block  
  90.                 e.printStackTrace();  
  91.             }  
  92.         }  
  93.     }  
  94.     /** 
  95.      * <pre> 
  96.      * 用io讀取檔案內容 
  97.      * </pre> 
  98.      *  
  99.      * @throws IOException 
  100.      *             讀取過程中發生錯誤 
  101.      *  
  102.      */  
  103.     /** 
  104.      * <pre> 
  105.      *  
  106.      * </pre> 
  107.      * @param path 
  108.      * @param charset 
  109.      * @throws IOException 
  110.      * 
  111.      */  
  112.     public void read(String path, String charset) 

    相關推薦

    java字元

    java虛擬機器預設的編碼是unicode指的是記憶體中的編碼是unicode,而進行io(包括網路和硬碟)傳輸時另外編碼,通過 System.getProperty("file.encoding")檢視,通常,預設為ansi,不過通過eclipse可以配置為其他編碼

    java字元;eclipse設定UTF-8

    把字符集中的字元 編碼為指定集合中某一物件(例如:位元模式、自然數序列、8位組或者電脈衝),以便文字在計算機中儲存和通過通訊網路的傳遞。 不同國家、不同計算機系統編碼方式不同; 中國大陸:GBK (規定檔案為GB13000) Unicode

    java:string2hexString 中文字元問題解決

    java 中提供了一些字串轉碼的工具類,比如:Base64,UrlEncoder & UrlDecoder。但是這些類,真的非常有侷限性,轉碼之後的字串,往往不能被當成檔案路徑識別。 於是將 字串轉成16進位制的字串就顯得非常有必要了。因為16進位制的

    java 視訊

    前臺通過ajaxfileupload外掛上傳提價資料: $.ajaxFileUpload({     url : "${ctx}/h5/h5preventiveEdu/updateEdu",//增加與修改通用     secureuri : false

    jAVA/JS 解碼(URLEncoder.encode decodeURIComponent)

    引用包:import java.net.URLDecoder; Java解碼: String s  = URLDecoder.decode(URLDecoder.decode(templateObj.getString("templateContent"), "UTF-8

    java 檔案(gb2315,gbk,utf-8)csv,excel

    最近做資料處理,需要將爬取的資料入庫,但是演算法提供的資料編碼格式和資料庫總是有出入,導致匯入的資料亂碼,所以寫一個轉碼程式,將檔案編碼轉為和資料庫一致。 package com.bjk.transcode; import java.io.FileInputStream; import j

    字元開源庫libiconv目前還不支援64位

    最新版的libiconv 1.14目前還不支援64位系統,只能編譯出32位庫。libiconv 1.14下載地址:libiconv介紹:linux系統編譯安裝方法:$ ./configure --prefix=/usr/local $ make $ make install執

    python 字元

    encode和decode python中做字元轉碼時,通常要用unicode作為中間碼 encode是將Unicode轉為其他碼。如 str1.encode('gb2312') decode是將其他碼轉為unicode,如 str2.decode('gb2312') 轉

    C++字元

    wchar_t* U8ToUnicode(char* szU8) { //UTF8 to Unicode //由於中文直接複製過來會成亂碼,編譯器有時會報錯,故採用16進位制形式 //char* szU8 = "abcd1234\xe4\xbd\xa0

    %特殊字元解碼異常解決方案

    JS加碼encodeURI(str) JS解碼decodeURI(str) JAVA解碼URLDecoder.decode(str, "UTF-8"); 摘要:Exception in thread main java.lang.IllegalArgumentExce

    js java中文 適用於用url傳遞中文引數

    第一種方法: 解決方法如下:1、在JS裡對中文引數進行兩次轉碼var login_name = document.getElementById("loginname").value;   login_name = encodeURI(login_name);   login_

    java中文

    request.setCharacterEncoding("UTF-8");  對字串變數str進行轉碼,程式碼如下: str = new String(str.getBytes("ISO88

    JAVA/JS 解碼(URLEncoder.encode | URLDecoder.decode | encodeURIComponent | decodeURIComponent)

    JS中一些文字拼接報文的時候,有些字元會導致報文出錯,所以這裡要用到轉碼。(其中的某些字元將被十六進位制的轉義序列進行替換) 引用包:import java.net.URLDecoder;               import java.net.URLEncoder

    請求Http時可能因為字元問題導致錯誤的特殊字元

    url轉換問題 String url = baseUrl + "?" + "name=" + name + "&age=" + age;     url = url.replaceAll(

    Java中文的例子,用來對付亂碼

    public class HelloWorld {    public static void main(String[] argv){      try{        System.out.println("中文");//1        System.out.

    在js中對中文和特殊字元,js(轉載)

    js對文字進行編碼涉及3個函式:escape,encodeURI,encodeURIComponent,相應3個解碼函式:unescape,decodeURI,decodeURIComponent1、   傳遞引數時需要使用encodeURIComponent,這樣組合的url才不會被#等特殊字元截斷。   

    java unicode

        public static String unUnicode(String text) {         StringBuilder gbk = new StringBuilder();         String[] hex = text.split("\\

    python字元問題-持續更新

    1.往excel表中寫中文: 加u 或者unicode("阿薩德","utf-8") 2.程式碼前一般加# -*- coding:utf-8 -*- 3.從web上獲取的字元中特殊符號如果轉碼錯誤可

    HTML字元

    HTML特殊字元的編碼表: 標記 編碼 實際名稱 ™ &#8482; € &euro; Space &#32; &nbsp; ! &#33; "

    在js中對中文和特殊字元,js

    js對文字進行編碼涉及3個函式:escape,encodeURI,encodeURIComponent,相應3個解碼函式:unescape,decodeURI,decodeURIComponent1、   傳遞引數時需要使用encodeURIComponent,這樣組合的u