gbk、utf-8、utf-16be编码问题

补充一下知识

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.慕课网
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值