本文目錄一覽:
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後台怎麼解決編碼問題
不用實現和繼承,自己封裝就可以了,想要什麼轉換自己對應封裝方法就可以了,這樣自己用起來也方便點。再往上找了個例子,你看看希望能幫到你!public class ChangeCharset {
/** 7位ASCII字符,也叫作ISO646-US、Unicode字符集的基本拉丁塊 */
public static final String US_ASCII = “US-ASCII”;
/** ISO 拉丁字母表 No.1,也叫作 ISO-LATIN-1 */
public static final String ISO_8859_1 = “ISO-8859-1”;
/** 8 位 UCS 轉換格式 */
public static final String UTF_8 = “UTF-8”;
/** 16 位 UCS 轉換格式,Big Endian(最低地址存放高位字節)字節順序 */
public static final String UTF_16BE = “UTF-16BE”;
/** 16 位 UCS 轉換格式,Little-endian(最高地址存放低位字節)字節順序 */
public static final String UTF_16LE = “UTF-16LE”;
/** 16 位 UCS 轉換格式,字節順序由可選的字節順序標記來標識 */
public static final String UTF_16 = “UTF-16”;
/** 中文超大字符集 */
public static final String GBK = “GBK”;
/**
* 將字符編碼轉換成US-ASCII碼
*/
public String toASCII(String str) throws UnsupportedEncodingException {
return this.changeCharset(str, US_ASCII);
}
/**
* 將字符編碼轉換成ISO-8859-1碼
*/
public String toISO_8859_1(String str) throws UnsupportedEncodingException {
return this.changeCharset(str, ISO_8859_1);
}
/**
* 將字符編碼轉換成UTF-8碼
*/
public String toUTF_8(String str) throws UnsupportedEncodingException {
return this.changeCharset(str, UTF_8);
}
/**
* 將字符編碼轉換成UTF-16BE碼
*/
public String toUTF_16BE(String str) throws UnsupportedEncodingException {
return this.changeCharset(str, UTF_16BE);
}
/**
* 將字符編碼轉換成UTF-16LE碼
*/
public String toUTF_16LE(String str) throws UnsupportedEncodingException {
return this.changeCharset(str, UTF_16LE);
}
/**
* 將字符編碼轉換成UTF-16碼
*/
public String toUTF_16(String str) throws UnsupportedEncodingException {
return this.changeCharset(str, UTF_16);
}
/**
* 將字符編碼轉換成GBK碼
*/
public String toGBK(String str) throws UnsupportedEncodingException {
return this.changeCharset(str, GBK);
}
/**
* 字符串編碼轉換的實現方法
*
* @param str
* 待轉換編碼的字符串
* @param newCharset
* 目標編碼
* @return
* @throws UnsupportedEncodingException
*/
public String changeCharset(String str, String newCharset)
throws UnsupportedEncodingException {
if (str != null) {
// 用默認字符編碼解碼字符串。
byte[] bs = str.getBytes();
// 用新的字符編碼生成字符串
return new String(bs, newCharset);
}
return null;
}
/**
* 字符串編碼轉換的實現方法
*
* @param str
* 待轉換編碼的字符串
* @param oldCharset
* 原編碼
* @param newCharset
* 目標編碼
* @return
* @throws UnsupportedEncodingException
*/
public String changeCharset(String str, String oldCharset, String newCharset)
throws UnsupportedEncodingException {
if (str != null) {
// 用舊的字符編碼解碼字符串。解碼可能會出現異常。
byte[] bs = str.getBytes(oldCharset);
// 用新的字符編碼生成字符串
return new String(bs, newCharset);
}
return null;
}
public static void main(String[] args) throws UnsupportedEncodingException {
ChangeCharset test = new ChangeCharset();
String str = “This is a 中文的 String!”;
System.out.println(“str: ” + str);
String gbk = test.toGBK(str);
System.out.println(“轉換成GBK碼: ” + gbk);
System.out.println();
String ascii = test.toASCII(str);
System.out.println(“轉換成US-ASCII碼: ” + ascii);
gbk = test.changeCharset(ascii, ChangeCharset.US_ASCII,
ChangeCharset.GBK);
System.out.println(“再把ASCII碼的字符串轉換成GBK碼: ” + gbk);
System.out.println();
String iso88591 = test.toISO_8859_1(str);
System.out.println(“轉換成ISO-8859-1碼: ” + iso88591);
gbk = test.changeCharset(iso88591, ChangeCharset.ISO_8859_1,
ChangeCharset.GBK);
System.out.println(“再把ISO-8859-1碼的字符串轉換成GBK碼: ” + gbk);
System.out.println();
String utf8 = test.toUTF_8(str);
System.out.println(“轉換成UTF-8碼: ” + utf8);
gbk = test.changeCharset(utf8, ChangeCharset.UTF_8, ChangeCharset.GBK);
System.out.println(“再把UTF-8碼的字符串轉換成GBK碼: ” + gbk);
System.out.println();
String utf16be = test.toUTF_16BE(str);
System.out.println(“轉換成UTF-16BE碼:” + utf16be);
gbk = test.changeCharset(utf16be, ChangeCharset.UTF_16BE,
ChangeCharset.GBK);
System.out.println(“再把UTF-16BE碼的字符串轉換成GBK碼: ” + gbk);
System.out.println();
String utf16le = test.toUTF_16LE(str);
System.out.println(“轉換成UTF-16LE碼:” + utf16le);
gbk = test.changeCharset(utf16le, ChangeCharset.UTF_16LE,
ChangeCharset.GBK);
System.out.println(“再把UTF-16LE碼的字符串轉換成GBK碼: ” + gbk);
System.out.println();
String utf16 = test.toUTF_16(str);
System.out.println(“轉換成UTF-16碼:” + utf16);
gbk = test.changeCharset(utf16, ChangeCharset.UTF_16LE,
ChangeCharset.GBK);
System.out.println(“再把UTF-16碼的字符串轉換成GBK碼: ” + gbk);
String s = new String(“中文”.getBytes(“UTF-8”), “UTF-8”);
System.out.println(s);
}
}
在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;
}
}
原創文章,作者:KBBY,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/143099.html