java 中String編碼和byte 解碼 總結

2021-07-01 18:05:07 字數 3109 閱讀 3227

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)

對 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)

轉換中使用以下規則:

字母數字字元 「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。所以直接列印就可以了

java 中String和Date型別轉化

問題背景 在web專案中,1.需要使用者手動從web前端輸入 yyyy mm dd 格式的字串,程式邏輯中將此字串轉化成date型存入資料庫。2.需要從資料庫中讀取date 型的資料取出,轉化成 string型。string date dateformat sdf new dateformat yy...

String解碼和byte 編碼實踐

本機預設使用字符集,可以使用chcp命令檢視 活動 頁936表示字符集為gb2312。前面已經詳細講述了位元組編碼和字元解碼,下面看具體例子 測試 測試測試 utf 8 string str2 new string str.getbytes utf 8 預設使用檔案的編碼進行解碼。string st...

Java中String和int相互轉換

1 如何將字串 string 轉換成整數 int?a.有兩個方法 1 int i integer.parseint string 或 i integer.parseint string int radix 2 int i integer.valueof my str intvalue 注 字串轉成 ...