1、InputStreamReader 是字節流通向字符流的橋梁:它使用指定的 charset 讀取字節並將其解碼為字符
InputStreamReader(InputStream in, String charsetName)
2、OutputStreamWriter 是字符流通向字節流的橋梁:可使用指定的 charset 將要寫入流中的字符編碼成字節。它使用的字符集可以由名稱指定或顯式給定,否則將接受平台默認的字符集。
OutputStreamWriter(OutputStream out, String charsetName)
3、String(byte[] bytes, Charset charset)
通過使用指定的 charset解碼指定的 byte數組,構造一個新的 String。
4、byte[] getBytes(Charset charset)
把JVM內存中unicode形式的String按encoding制定的編碼,轉成字節流
使用給定的 charset 將此 String 編碼到 byte 序列,並將結果存儲到新的 byte 數組。
5、URLEncoder。encode(String s, String enc)
使用指定的編碼機制將字符串轉換為 application/x-www-form-urlencoded 格式。
對 String 編碼時,使用以下規則:
字母數字字符 "a" 到 "z"、"A" 到 "Z" 和 "0" 到 "9" 保持不變。
特殊字符 "."、"-"、"*" 和 "_" 保持不變。
空格字符 " " 轉換為一個加號 "+"。
所有其他字符都是不安全的,因此首先使用一些編碼機制將它們轉換為一個或多個字節。然后每個字節用一個包含 3 個字符的字符串 "%xy" 表示,其中 xy 為該字節的兩位十六進制表示形式。推薦的編碼機制是 UTF-8。但是,出於兼容性考慮,如果未指定一種編碼,則使用相應平台的默認編碼。
例如,使用 UTF-8 編碼機制,字符串 "The string ü@foo-bar" 將轉換為 "The+string+%C3%BC%40foo-bar",因為在 UTF-8 中,字符 ü 編碼為兩個字節,C3 (十六進制)和 BC (十六進制),字符 @ 編碼為一個字節 40 (十六進制)。
6、URLDecoder.decode(String s, String enc)
使用指定的編碼機制對 application/x-www-form-urlencoded 字符串解碼。
轉換中使用以下規則:
字母數字字符 "a" 到 "z"、"A" 到 "Z" 和 "0" 到 "9" 保持不變。
特殊字符 "."、"-"、"*" 和 "_" 保持不變。
加號 "+" 轉換為空格字符 " "。
將把 "%xy" 格式序列視為一個字節,其中 xy 為 8 位的兩位十六進制表示形式。然后,所有連續包含一個或多個這些字節序列的子字符串,將被其編碼可生成這些連續字節的字符所代替。可以指定對這些字符進行解碼的編碼機制,或者如果未指定的話,則使用平台的默認編碼機制。
該解碼器處理非法字符串有兩種可能的方法。一種方法是不管該非法字符,另一種方法是拋出 IllegalArgumentException 異常。解碼器具體采用哪種方法取決於實現。
案例:
1.JVM內部的String,Char都是用unicode存儲(沒有任何編碼),比如:
"分"的unicode=20998(十進制)String=[20998],String中有1個char
"分享"的unicode=20998,20139 (十進制)String=[20998,20139],String中有2個char
無論系統編碼是什么,"分"這個字在JVM中都是20998
2.String.getBytes("encoding")的意思:
把JVM內存中unicode形式的String按encoding制定的編碼,轉成字節流,比如漢字"分":
String="分"
String.getBytes("utf-8")//把String轉成utf-8字節流,漢字"分"為3個字節[0xe5,0x88,0x86]
String.getBytes("gbk")//把String轉成gbk字節流,漢字"分"為2個字節[0xb7,0xd6]
String.getBytes()//按JVM默認編碼轉成字節流。linux,如果LANG=en_US,就是iso8859-1,如果是windows eclipse就是UTF-8
3.String std=new String(byte b[],"encoding")的意思
把是encoding編碼的字節流b,轉換成String,比如:
b=[0xe5,0x88,0x86]
String std=new String(byte b[],"utf-8")//把utf-8的字節數組b,轉成string。b中是3個字節的utf8編碼。執行后string=[20998]
b=[0xb7,0xd6]
String std=new String(byte b[],"gbk")//把gbk的字節數組b,轉成string。b中是2個字節的gbk編碼。執行后string=[20998]
4.在linux,LANG=en_US的環境下打印utf8的漢字:
因為終端(secretCRT)只能認單字節流的utf8,若以直接打印utf8的多字節String就會是“???”
需要把utf8的string轉換成單字節流編碼的iso8859-1,secretCRT才能按utf8顯示成漢字,比如:
s1="分"//s1中有一個char=[20998]
String s2=new String(s1.getBytes("utf-8"),"iso8859-1")//獲取utf-8編碼的s1字節流,並編碼成iso8859-1,s2中有三個char,分別是[0xe5,0x88,0x86]
println(s2)//在utf8終端控制台上打印s2
如果終端(secretCRT)的顯示編碼是default(其實就是iso8859-1能顯示GBK),那執行以下代碼:
s1="分"//s1中有一個char=[20998]
String s2=new String(s1.getBytes("gbk"),"iso8859-1")//獲取gbk編碼的s1字節流,並編碼成iso8859-1,s2中有兩個char,分別是[0xb7,0xd6]
println(s2)//在gbk終端控制台上打印s2
在windows上,因為eclipse控制台系統默認編碼是utf8。所以直接打印就可以了