本文目錄一覽:
java中編碼與解碼分別指什麼?
java中編碼:URLEncoder.encode(strUri,”utf-8″);
java中解碼碼:URLDecoder.decode(strUri,”utf-8″);
java編碼和解碼
流讀取文件,具有轉換編碼功能的有:OutputStreamWriter和InputStreamReader,
構造器有如:
InputStreamReader(InputStream in, String charsetName)
創建使用指定字符集的 InputStreamReader。
OutputStreamWriter(OutputStream out, String charsetName)
創建使用指定字符集的 OutputStreamWriter。
處理字符串編碼問題:
重新對獲取的字符串進行編碼:Byte[] bytes = str.getBytes(String encodeCharsetNam);
重新對bytes進行解碼,創建新的字符串對象:str = new String(Byte[] bytes,String decodeCharsetName);
一般結合使用:str = new String(str.getBytes(String encodeCharsetName),String decodeCharsetName);
例如:resultName=new String(username.getBytes(“ISO-8859-1″),”UTF-8”);
還可以加入判斷:
if(!Charset.forName(“gbk”).newEncoder().canEncode(str)){str = new Strin(str.getBytes(“ISO-8859-1″),”UTF-8”);}else{str = new String(str.getBytes(“ISO-8859-1″),”gbk”);}
處理請求參數傳遞編碼問題:
java中編碼:URLEncoder.encode(strUri,”utf-8″);
java中解碼碼:URLDecoder.decode(strUri,”utf-8″);
js中編碼:encodeURIComponent(strUri);encodeURI(strUri);escape(str);
js中解碼:decodeURIComponent(strUri);decodeURI(strUri);unescape(str);
補充概念:
URI組件:主機、端口、路徑、查詢參數、片段等。
URI組件分隔符::/?#[]@,冒號用於分隔協議和主機,/用於分隔主機和 路徑,?用於分隔路徑和查詢參數,用於分隔多個查詢參數等。
URI中的不安全字符或保留字符: ! * ‘ ( ) ; : @ = + $ , / ? # [ ] 他們具有特殊作用,例如上面的分隔作用。
URI允許出現的字符:只允許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字符以及所有保留字符,其他字符均需要經過編碼之後才能出現在Url中,比如使用保留字符的原意,而不是特殊作用。
js向java/jsp的編碼與解碼:
js中編碼:encodeURI(encodeURI(strUri));decodeURIComponent(decodeURIComponent(strUri));
java/jsp中解碼: java.net.URLDecoder.decode(strUri,”UTF-8″);
js中編碼兩次的問題:如果使用一次編碼,在瀏覽器地址欄里,瀏覽器認為%是個轉義字符,瀏覽器會把%與%之間的編碼值,兩位兩位取出後進行解碼。
然後再傳遞給處理頁面,然後由處理頁面進行再次解碼,這樣前面就缺少了一次編碼過程,所以前面需要連續兩次編碼。
java里關於String的編碼與解碼
public
byte[]
getBytes(String
charsetName)
使用指定的字符集將此String編碼為byte序列,結果存在一個byte數組中
public
String(byte[]
bytes,
String
charsetName)
通過使用指定的
charset
解碼指定的
byte
數組,構造一個新的
String。
在網絡傳輸中,信息都是以字節序列的方式傳輸的。所以,發送方的String要按照某種編碼方式(如UTF-8,GBK)編碼為字節序列,在網絡中傳輸後,接收方取得這個字節序列,按照相同的編碼方式將字節序列解碼為String。
請看下面的代碼片段:
String
name
=
“張三”;
byte[]
b1
=
name.getBytes(“UTF-8”);
String
name1
=
new
String(b1,
“UTF-8”);
//編碼解碼相同,正常顯示
System.out.println(name1);
String
name2
=
new
String(b1,
“GBK”);
//編碼解碼不同,亂碼
System.out.println(name2);
byte[]
b2
=
name.getBytes(“GBK”);
String
name3
=
new
String(b2,
“GBK”);
//編碼解碼相同,正常顯示
System.out.println(name3);
String
name4
=
new
String(b2,
“UTF-8”);
//編碼解碼不同,亂碼
System.out.println(name4);
至於你的那個情況,要先用gbk編碼,然後再用utf-8解碼才能獲得正常的字符串,我估計是因為
1.傳輸過來的字節碼是用utf-8編碼的,假設字節碼為b。
2.你獲得的那個字符串,假設為s,是用gbk對b進行解碼獲得的字符串,所以是亂碼。
3.你使用gbk對s進行編碼,用gbk解碼之後再編碼,於是獲得了原來的b。
4.你使用utf-8解碼,所以獲得了正常的字符串。
簡單的說:
b
–
(gbk解碼)
–
亂碼
–
[此處開始是你做的](gbk編碼)
–
b
–
(utf-8解碼)
–
正常字符串
研究完編碼收穫會不小的,對以後理解Java的輸入輸出(尤其是網絡通信和文件讀寫)都很有幫助。
java 中編碼解碼問題
new String(strLine.getBytes(“iso8859-1″),”gb2312”)
其實這裡很好明白
首先將字符串轉換成byte數組。。以iso8859-1的編碼來轉換。。
然後使用new String創建一個新字符串,前面帶上byte[]數組 後面帶上他的具體編碼。。
一般轉碼都使用這樣的方式。。JSP里經常出現亂碼的
都是加上過濾器然後中間使用這個new String(strLine.getBytes(“iso8859-1″),”gb2312”)方式將編碼轉換。
請採納答案,支持我一下。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/257968.html