本文目錄一覽:
- 1、java base64解碼 怎麼是亂碼呢
- 2、java web程序中對地址欄中文解碼的方式有哪些?
- 3、在Java中如何進行BASE64編碼和解碼
- 4、java里關於String的編碼與解碼
- 5、java中編碼與解碼分別指什麼?
- 6、java是如何編碼解碼的
java base64解碼 怎麼是亂碼呢
會亂碼的原因是你的編碼不一致導致的
php中的urlencode的編碼是和系統編碼一致的(比如windows默認gb2312,ubuntu默認utf-8)
所以首先需要確定你的系統編碼,之後根據得到的系統編碼在調用java的decode方法的時候,將這個編碼傳入(考慮到你的例子中有繁體字,所以,建議你使用utf-8編碼),以下是我使用utf-8編碼的例子(php環境是ubuntun下)
java web程序中對地址欄中文解碼的方式有哪些?
瀏覽器和伺服器之間是否能傳遞中文取決於伺服器端的解碼方式。一、可以修改伺服器配置文件以提供中文解碼支持;二、在瀏覽器中對路徑進行編碼,如使用encodeUrl(完整路徑)進行utf-8編碼,伺服器端用java.net.Decoder.decoder(獲取傳遞的中文之值)進行解碼,這時request.setcharacter encode()方法要設置為對應的utf-8。
在Java中如何進行BASE64編碼和解碼
import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;
// 將 s 進行 BASE64 編碼
public static String getBASE64(String s) {
if (s == null) return null;
return (new sun.misc.BASE64Encoder()).encode( s.getBytes() );
}
// 將 BASE64 編碼的字元串 s 進行解碼
public static String getFromBASE64(String s) {
if (s == null) return null;
BASE64Decoder decoder = new BASE64Decoder();
try {
byte[] b = decoder.decodeBuffer(s);
return new String(b);
} catch (Exception e) {
return null;
}
}
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中編碼與解碼分別指什麼?
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是如何編碼解碼的
[java] view plain copy
String name=”I am 小明”;
toHex(name.toCharArray());
span style=”font-size:18px; white-space: pre;”/spanpre name=”code” class=”java”try{
byte[] iso8859=name.getBytes(“ISO-8859-1”);
[java] view plain copy
toHex(iso8859);
[java] view plain copy
byte[] gb2312=name.getBytes(“GB2312”);
[java] view plain copy
toHex(gb2312);
[java] view plain copy
byte[] gbk=name.getBytes(“GBK”);
[java] view plain copy
toHex(gbk);
[java] view plain copy
}
[java] view plain copy
String str=”小米”;
byte[] b=str.getBytes(“UTF-8”);
[java] view plain copy
public byte[] getBytes(String charsetName)
throws UnsupportedEncodingException {
if (charsetName == null) throw new NullPointerException();
return StringCoding.encode(charsetName, value, 0, value.length);
}
[java] view plain copy
static byte[] encode(String charsetName, char[] ca, int off, int len)
throws UnsupportedEncodingException
{
StringEncoder se = deref(encoder);
String csn = (charsetName == null) ? “ISO-8859-1” : charsetName;
if ((se == null) || !(csn.equals(se.requestedCharsetName())
|| csn.equals(se.charsetName()))) {
se = null;
try {
Charset cs = lookupCharset(csn); //生成字符集實例
if (cs != null)
se = new StringEncoder(cs, csn);
} catch (IllegalCharsetNameException x) {}
if (se == null)
throw new UnsupportedEncodingException (csn);
set(encoder, se);
}
return se.encode(ca, off, len);
}
[java] view plain copy
private static Charset lookupCharset(String csn) {
if (Charset.isSupported(csn)) {
try {
return Charset.forName(csn);
} catch (UnsupportedCharsetException x) {
throw new Error(x);
}
}
return null;
}
[java] view plain copy
private StringEncoder(Charset cs, String rcn) {
this.requestedCharsetName = rcn;
this.cs = cs;
this.ce = cs.newEncoder()
.onMalformedInput(CodingErrorAction.REPLACE)
.onUnmappableCharacter(CodingErrorAction.REPLACE);
this.isTrusted = (cs.getClass().getClassLoader0() == null);
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/256388.html