作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/
1.ASCII碼
上個世紀60年代,美國制定了一套字元編碼,對英語字元與二進位位之間的關係,做了統一規定。這被稱為ASCII碼,一直沿用至今。
ASCII碼一共規定了128個字元的編碼,比如空格“SPACE”是32(二進位00100000),大寫的字母A是65(二進位01000001)。這128個符號(包括32個不能列印出來的控制符號),只佔用了一個位元組的後面7位,最前面的1位統一規定為0。
2.Unicode
如果有一種編碼,將世界上所有的符號都納入其中。每一個符號都給予一個獨一無二的編碼,那麼亂碼問題就會消失。這就是Unicode,就像它的名字都表示的,這是一種所有符號的編碼。
Unicode當然是一個很大的集合,現在的規模可以容納100多萬個符號。每個符號的編碼都不一樣,比如,U+0639表示阿拉伯字母Ain,U+0041表示英語的大寫字母A,U+4E25表示漢字“嚴”。具體的符號對應表,可以查詢unicode.org,或者專門的漢字對應表。
3.UTF-8
互連網的普及,強烈要求出現一種統一的編碼方式。UTF-8就是在互連網上使用最廣的一種unicode的實現方式。其他實現方式還包括UTF-16和UTF-32,不過在互連網上基本不用。重複一遍,這裡的關係是,UTF-8是Unicode的實現方式之一。
UTF-8最大的一個特點,就是它是一種變長的編碼方式。它可以使用1~4個位元組表示一個符號,根據不同的符號而變化位元組長度。
UTF-8的編碼規則很簡單,只有二條:
1)對於單位元組的符號,位元組的第一位設為0,後面7位為這個符號的unicode碼。因此對於英語字母,UTF-8編碼和ASCII碼是相同的。
2)對於n位元組的符號(n>1),第一個位元組的前n位都設為1,第n+1位設為0,後面位元組的前兩位一律設為10。剩下的沒有提及的二進位位,全部為這個符號的unicode碼。
4.應用:
Java中,如果我們用java.io.FileReader或者java.io.FileWriter來讀寫檔案的話,我們會發現在FileReader和 FileWriter中我們只能擷取編碼方式,而不能設定。這樣,在FileReader和FileWriter中的編碼設定只能服從於一些更為底層的設定,那麼在讀寫多種語言編碼的檔案時就很容易出現亂碼。解決的方法是採用java.io.FileInputStream/java.io.InputStreamReader和java.io.FileOutputStream/java.io.OutputStreamWriter。在 InputStreamReader和OutputStreamWriter中,可以通過指定編碼方式來完成UTF-8檔案的讀寫。當然我們可以通過 java.io.BufferedReader和java.io.BufferedWriter來提高效率。
比如:
java.io.BufferedWriter writer = null;
java.io.FileOutputStream writerStream = new java.io.FileOutputStream(filename);
writer = new java.io.BufferedWriter(new java.io.OutputStreamWriter(writerStream, "UTF-8"));
// do something
// writing file
writer.close();
也可以使用下列的方法,
例如: 用 java 將檔案的編碼從GBK 轉換成 UTF8
private static void transferFile(String srcFileName, String destFileName) throws IOException {
String line_separator = System.getProperty("line.separator");
FileInputStream fis = new FileInputStream(srcFileName);
StringBuffer content = new StringBuffer();
DataInputStream in = new DataInputStream(fis);
BufferedReader d = new BufferedReader(new InputStreamReader(in, "GBK"));
String line = null;
while ((line = d.readLine()) != null)
content.append(line + line_separator);
d.close();
in.close();
fis.close();
Writer ow = new OutputStreamWriter(new FileOutputStream(destFileName), "utf-8");
ow.write(content.toString());
ow.close();
}
作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/