public class Stringcode {
public static void main(String[] args) throws Exception {
1、编码 (字符-->字节)
String str = "呼啦啦";
// byte b[] = str.getBytes("gbk"); //指定編碼
byte b[] = str.getBytes();// 默認編碼
printBytes(b);
输出:27 -111 -68 -27 -107 -90 -27 -107 -90
2、解码(字节-->字符)
String s = new String(b);
System.out.println(s);
输出:呼啦啦
3、解码还原错误
String str2 = "還你黑胡椒";
byte b2[] = str2.getBytes();// 编码
String ss = new String(b2, "iso8859-1");
System.out.println("乱码:" + ss);// 解码错误
输出:乱码:é‚„ä½ é»‘èƒ¡æ¤’
byte b3[] = ss.getBytes("iso8859-1");// 再次編碼
String sss = new String(b3);// 再次解碼
System.out.println("真實的:" + sss);
输出:真實的:還你黑胡椒
4、編碼錯誤----無法救 编码编错必挂,解码解错可以补救!
String a = "單獨上課";
byte aa[] = a.getBytes("iso8859-1");
printBytes(aa);
输出:63 63 63 63
5、“联通”的 碼值---乱码,utf-8 gbk 混一起,分辨不出
String lt = "联通";
byte lt2[] = lt.getBytes("gbk");
for (int n : lt2) {
// 转换二进制、输出后8位
System.out.print(Integer.toBinaryString(n & 0xff) + " ");
}
“联通”: 11000001 10101010 11001101 10101000
“移动”: 11010010 11000110 10110110 10101111
byte lt2[] = lt.getBytes();
“联通”:11101000 10000001 10101111 11101001 10000000 10011010
“移动”:11100111 10100111 10111011 11100101 10001011 10010101
}
private static void printBytes(byte[] b) {
for (int bb : b) {
System.out.print(bb + " ");
}
System.out.println();
}
}
•ASCII:美国标准信息交换码。用一个字节的7位可以表示。
•ISO8859-1:拉丁码表。欧洲码表。用一个字节的8位表示。
•GB2312:中国的中文编码表。
•GBK:中国的中文编码表升级,融合了更多的中文文字符号。
•Unicode:国际标准码,融合了多种文字。
• 所有文字都用两个字节来表示,Java语言使用的就是unicode
•UTF-8:一种变长的unicode码的实现方式,由1~4个字节表示。
Unicode:只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制 代码应该如何存储。
UTF-8:是Unicode的实现方式之一。
Unicode符号范围 UTF-8编码方式
(十六进制) (二进制)
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx