java中的编码
- 字库表:相当于所有可读或者可显示字符的数据库
- 编码字符集(编码):用一个编码值来表示一个字符在字库中的位置
- 字符编码(编码格式):把编码值转换成另外一种存储格式
Unicode就是上文中提到的编码字符集,而UTF-8就是字符编码,即Unicode规则字库的一种实现形式。
编码字符集为字库表中的字符位置编码,两者一一对应,由于很多时候只使用到字库中的一部分字符,若使用编码字符集则会造成浪费,故使用字符编码
java的string使用的编码是unicode,但是在存储到外存或者通过网络传输前没有编码格式
- java字符串编码
public static void main(String[] args) throws IOException {
String s = "篱开罗A";
//不指定则使用项目默认字符编码将字符串转换位字节数组
byte[] bytesWithUTF8 = s.getBytes();
//指定使用GBK编码格式
byte[] bytesWithGBK = s.getBytes("GBK");
//不指定字符编码,默认使用项目字符编码,此处是UTF-8
System.out.println(new String(bytesWithUTF8));
for (byte b : bytesWithUTF8) {
//toHexString接收的参数为int,此处byte被强制转换成int,& 0xff去除高24位
//UTF-8每个中文使用三个字节,字母一个字节
System.out.print(Integer.toHexString(b & 0xff) + " ");
}
System.out.println();
//指定使用GBK进行解码
System.out.println(new String(bytesWithGBK,"GBK"));
for (byte b : bytesWithGBK) {
// GBK每个中文使用两个字节,字母一个字节
System.out.print(Integer.toHexString(b & 0xff) + " ");
}
System.out.println();
//原本UTF-8编码格式的字节数组被指定使用GBK进行解码,得到乱码
String errStr = new String(bytesWithUTF8, "GBK");
//对错误字符串使用GBK进行编码,获取原字节数组
byte[] bytes = errStr.getBytes("GBK");
//使用UTF-8编码格式进行解码
String rightStr = new String(bytes, "UTF-8");
System.out.println("errStr: " + errStr);
System.out.println("rightStr: " + rightStr);
}