补充一下知识
0xff 什么意思?
是按位或运算符 & 是按位与运算符 ^ 是按位异或运算符 把number转换为二进制,只取最低的8位(bit)。因为0xff二进制就是1111 1111。 &
运算是,如果对应的两个bit都是1,则那个bit结果为1,否则为0. 比如 1010 & 1101 = 1000 (二进制)
由于0xff最低的8位是1,因此number中低8位中的&之后,如果原来是1,结果还是1,原来是0,结果位还是0.高于8位的,0xff都是0,所以无论是0还是1,结果都是0。
代码和注释讲解
package com.tuzi;
public class EncodeTest {
public static void main(String[] args)throws Exception{
//用项目默认的gbk
String s = "秃子ABC";
byte[] bytes1 = s.getBytes();//转换成字节序列用的是项目默认的编码gbk
for(byte b:bytes1){
//把字节(转换成了int)以16进制的方式显示
System.out.print("项目默认的gbk:"+Integer.toHexString(b & 0xff)+" ");
}
//转换成gbk
System.out.println();
byte[] bytes2 = s.getBytes("gbk");
//gbk编码中文占用两个字节,英文占用1个字节
for(byte b:bytes2){
//把字节(转换成了int)以16进制的方式显示
System.out.print("装换成gbk:"+Integer.toHexString(b & 0xff)+" ");
}
//utf-8
System.out.println();
byte[] bytes3 = s.getBytes("utf-8");
//utf-8编码中中文占3个字节,英文占一个字节
for(byte b:bytes3){
//把字节(转换成了int)以16进制的方式显示
System.out.print("转换成utf-8:"+Integer.toHexString(b & 0xff)+" ");
}
//java是双字节编码,utf-16be
System.out.println();
byte[] bytes4 = s.getBytes("utf-16be");
//utf-16be中文占2个字节,英文占用2个字节
for(byte b:bytes4){
//把字节(转换成了int)以16进制的方式显示
System.out.print("转换成utf-16be:"+Integer.toHexString(b & 0xff)+" ");
}
System.out.println();
/**
* 当你的字节序列是某种编码时,这个时候想把字节序列变成字符串,也需要用这个种编码方式,否则会出现乱码
*/
//错误
String str1 = new String(bytes4);//用项目默认的编码
System.out.print(str1);
//正确
System.out.println();
String str2 = new String(bytes4,"utf-16be");
System.out.print(str2);
}
}
参考链接
1.https://zhidao.baidu.com/question/809608756667707252.html
2.慕课网