GBK和UTF-8编码的一些探索。

本文详细介绍了UTF-8和GBK两种字符编码方式的区别及转换过程,包括不同字符集下汉字和英文数字的字节数对比,以及编码转换时可能出现的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package cn.dzr.teststring;

import java.io.UnsupportedEncodingException;


public class Test2
{
    public static void main(String[] args) throws UnsupportedEncodingException
    {
        String str ="我是中国人";
        
        byte[] buff = str.getBytes("utf-8");
        //buff为 我是中国人的  utf-8 的编码。
        
        P(buff);
        
        byte[] buf2  = str.getBytes("GBK");
        P(buf2);
        
        
        
        String str2= new String(buff,"utf-8");
        //str2为buff通过utf-8 译码出来的字符串.
        System.out.println(str2);
        
        String str3= new String(buff,"GBK");
        //str3为 utf-8进行编码的buff 以"GBK“进行解码的结果...
        
        System.out.println(str3);
        
        byte[] buff2 = str3.getBytes("GBK");
        //buff2为str3 以GBK进行编码的结果。按理说,应该就和buff是相同的。
        P(buff2);
        
        String str4 = new String(buff2,"utf-8");
        System.out.println(str4);
    }
    
        static void P(byte[] buff)
        {
            int len = buff.length;
            for(int i = 0;i<len ; i++)
            {
                System.out.print(buff[i]+" ");
            }
            System.out.println();
        }
}



输出结果..

-26 -120 -111 -26 -104 -81 -28 -72 -83 -27 -101 -67 -28 -70 -70
-50 -46 -54 -57 -42 -48 -71 -6 -56 -53
我是中国人
鎴戞槸涓浗浜?
-26 -120 -111 -26 -104 -81 -28 -72 -83 -27 -101 -67 -28 -70 63
我是中国??


可以发现,通过GBK 和UTF-8编码之后,输出的字节数组有明显的不同。

而前面,我是中国人 这五个汉字在进行编码的时候
。utf-8 转换成了15个字节。
而GBK之转换成了10个字节。

也就是说,utf-8将一个汉字解码为3个字节。而GBK则解码为2个字节。

在这里,由于单数个汉字,在转为UTF-8的时候,会变成单数个字节。而再通过GKB进行解码最后一个单位的字节,将会解析成8个字。
最后的一个?号,是GBK在解析最后的一个字节自动补上的。
所以,当我们再次将这段GBK码通过GBK编码时,得出的结果与前面已经不同。
如上面的情况, 最后一位的 -70变成了 63.

如果是偶数个汉字呢。我们做一下测试。



将str 改成“我是中国”。则输出结果如下所示:


-26 -120 -111 -26 -104 -81 -28 -72 -83 -27 -101 -67
-50 -46 -54 -57 -42 -48 -71 -6
我是中国
鎴戞槸涓浗
-26 -120 -111 -26 -104 -81 -28 -72 -83 -27 -101 -67
我是中国

这样,通过再次编码,能够得到正确的结果。



我们再次对英文和数字进行测试。。
String str ="abcdef121231";

最后的输出结果为:

97 98 99 100 101 102 49 50 49 50 51 49
97 98 99 100 101 102 49 50 49 50 51 49
abcdef121231
abcdef121231
97 98 99 100 101 102 49 50 49 50 51 49
abcdef121231


可见,GBK和utf-8对英文和数字的编码是相同的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值