- 字庫(kù)表:相當(dāng)于所有可讀或者可顯示字符的數(shù)據(jù)庫(kù)
- 編碼字符集(編碼):用一個(gè)編碼值來表示一個(gè)字符在字庫(kù)中的位置
- 字符編碼(編碼格式):把編碼值轉(zhuǎn)換成另外一種存儲(chǔ)格式
Unicode就是上文中提到的編碼字符集,而UTF-8就是字符編碼,即Unicode規(guī)則字庫(kù)的一種實(shí)現(xiàn)形式薄货。
編碼字符集為字庫(kù)表中的字符位置編碼误堡,兩者一一對(duì)應(yīng)艰猬,由于很多時(shí)候只使用到字庫(kù)中的一部分字符,若使用編碼字符集則會(huì)造成浪費(fèi),故使用字符編碼
java的string使用的編碼是unicode购笆,但是在存儲(chǔ)到外存或者通過網(wǎng)絡(luò)傳輸前沒有編碼格式
- java字符串編碼
public static void main(String[] args) throws IOException {
String s = "籬開羅A";
//不指定則使用項(xiàng)目默認(rèn)字符編碼將字符串轉(zhuǎn)換位字節(jié)數(shù)組
byte[] bytesWithUTF8 = s.getBytes();
//指定使用GBK編碼格式
byte[] bytesWithGBK = s.getBytes("GBK");
//不指定字符編碼则剃,默認(rèn)使用項(xiàng)目字符編碼耘柱,此處是UTF-8
System.out.println(new String(bytesWithUTF8));
for (byte b : bytesWithUTF8) {
//toHexString接收的參數(shù)為int,此處byte被強(qiáng)制轉(zhuǎn)換成int棍现,& 0xff去除高24位
//UTF-8每個(gè)中文使用三個(gè)字節(jié)调煎,字母一個(gè)字節(jié)
System.out.print(Integer.toHexString(b & 0xff) + " ");
}
System.out.println();
//指定使用GBK進(jìn)行解碼
System.out.println(new String(bytesWithGBK,"GBK"));
for (byte b : bytesWithGBK) {
// GBK每個(gè)中文使用兩個(gè)字節(jié),字母一個(gè)字節(jié)
System.out.print(Integer.toHexString(b & 0xff) + " ");
}
System.out.println();
//原本UTF-8編碼格式的字節(jié)數(shù)組被指定使用GBK進(jìn)行解碼己肮,得到亂碼
String errStr = new String(bytesWithUTF8, "GBK");
//對(duì)錯(cuò)誤字符串使用GBK進(jìn)行編碼士袄,獲取原字節(jié)數(shù)組
byte[] bytes = errStr.getBytes("GBK");
//使用UTF-8編碼格式進(jìn)行解碼
String rightStr = new String(bytes, "UTF-8");
System.out.println("errStr: " + errStr);
System.out.println("rightStr: " + rightStr);
}