编码相关问题整理

本文整理了UTF-8、GBK、GBK2312与Unicode编码的关系,探讨了Java中char类型与编码的冲突,通过测试揭示了不同编码下字符占用的字节数,并解释了Java中char类型为何可能引发编码错误。

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

对于常用的编码UTF-8、GBK、GBK2312、Unicode的关系整理

这个问题的引出是因为我发现java中基本数据类型char是占两个字节的,而c语言中char是占用一个字节。要知道编码中文字符的时候往往是2-4个字节,不同编码方式下也会有不同。那么问题来了,java中用的什么编码方式存字符呢?如果是笔画特别多的中文字符如何放到2个字节中?

编码历史

GBK2312是较早出的中文的编码方式,后来GBK收录了GBK2312同时又增加了一些中文字库。而UTF-8是多语言的编码方式,不仅针对中文具有更好的通用性。unicode是UTF之前就提出的,他是对全球所有语言进行统一编码的规范,收录了所有的字符,不过编码空间利用率低。
GBK
GBK编码是1-2个字节,英文是1个字节,中文是2个字节,全角的英文是2个字节。
UTF-8
UTF-8编码是1或3-4个字节,英文是1个字节,中文大都是3个字节,少数是4个字节。
unicode
unicode是很多系统默认文件使用的编码方式,他一般要占用4个字节,英文也是4个字节,大多数中文也是4个字节。如果是及其偏僻的中文就要占6个字节,这样的中文是GBK都没有收录的。

下面我们进行一个测试看看几种编码的占用字节数:

public static void main(String[] args) throws UnsupportedEncodingException {
        String str="a";
        String str2="我";
        String str3="��";//这是个很生僻的字,浏览器都没解析出来...
        print(str);
        System.out.println("-----");
        print(str2);
        System.out.println("-----");
        print(str3);
    }
    public static void print(String s) throws UnsupportedEncodingException{
        System.out.println("default:"+s.getBytes().length);
        System.out.println("utf-8  :"+s.getBytes("utf-8").length);
        System.out.println("gbk    :"+s.getBytes("gbk").length);
        System.out.println("unicode:"+s.getBytes("unicode").length);
    }
打印
default:1
utf-8  :1
gbk    :1
unicode:4
-----
default:3
utf-8  :3
gbk    :2
unicode:4
-----
default:4
utf-8  :4
gbk    :1
unicode:6

小结: utf-8 gbk中英文都是1字节,unicode是4个字节。gbk中汉字是2字节,对于生僻字gbk中没有收录,因而强行解码是?,即一个字节。utf-8汉字是3-4个字节生僻的字是4个字节。unicode汉字一般是4个字节,生僻字是6个字节。

延伸: java中char是俩字节因而char a="��"; 会报错,这个字不是合法的char,char内部的编码方式(网上说是utf16)是只有2字节以内的部分,超过2字节的自动不能赋值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值