1.先转载两篇关于字符和字符集的文章,很全面且详细
(1)字符集和字符编码(Charset & Encoding)
(2)字符编码与字符集的区别
2.字节 Byte
字节是计算机存储容量的计量单位,比如一张图片占用的存储容量是3000字节
与字节密切相关的是比特bit,bit是数据传输的计量单位,我们知道1个字节占用8个二进制位,即【1Byte=8bit】
每个二进制位都有0和1两种状态,因此1字节的8个二进制位,能表示256种状态为,即2的8次方
那么大家平常说的1KB=1024B,1MB=1024KB,这里面的B指的是字节Byte
2.字符 Character 或者 Char
字符是我们生活中常见的一种符号,比如字母 a,它就是一个字符
一个汉字,比如 中国的“中”,它也是一个字符,并且我们电脑键盘上面的各种字母,标点符号等等都是字符
平常会听到有人说,1个中文字符占用2个字节,1个数字或者英文字符占用1个字节
对于这种说法,其实没有什么对错之分,如果他能帮你理解字符和字节的区别,你这样记着未尝不可
3.字符集
上面说字母 a,就是一个字符,那么 alibaba 则组成了一个字符串
但字符串,并不是字符集,这到时要严格区分
我的理解是:字符集就是用来实现字节与字符之间的映射而产生的,为什么这么说呢
因为字节是计算机的容量的计量单位,而字符则是现实生活中的抽象,对于计算机而言
它是没办法直接理解字符的,因此要定义字符和字节之间的映射,那么字符集就是这样产生的,常见的字符集有
字符集 | 每个字符占用字节数 |
ASCII | 1 |
UCS-2 | 2 (UCS 即 Unicode CharSet) |
UCS-4 | 4 |
UTF-8 | 1-6 其中1个中文占2个字节 |
UTF-16 | 2-4 |
GB2312 | 1-2 其中1个汉字占2个字节 |
GB18030 | 1-4 |
所以我们再来看上面那句话:1个中文字符占用2个字节,其实不太对,要看你用的什么字符集
对于各种字符集无非是为了适用各种语言的需要,比如在美国使用ASCII字符集就够用了
因为 ASCII 每个字符用1个字节表示,而每个字节占8个二进制位,总共就有 256 种形态了,完全够用
但是对于中文来说,就不够用了,所以产生了GBK这种字符集
而我们学Java的都知道,JDK定义一个字符占用2个字节,其实就是UCS-2字符集
USC-2 因为1个字符占2个字节,能表示65536种形态,在全世界范围内,基本够用了
因此Java号称使用Unicode字符集编码字符,在任何地方都是通用的
同时,也有这样的定义
Double Byte Character Set :DBCS 即双字节字符,始终使用2个字节表示一个字符,就是 UCS-2
Multi Byte Character Set:MBCS 即多自己字符,其实就是可变字节字符,因为不同的字符,占用的字节数可能不同
注意:除了 UCS-2 我们称之为双字节字符,其余都定义为 MBCS
4.字符编码
这又是一个容易混淆的概念,不过大体上把它当做字符集编码,也是没问题的
比如我们是GBK编码,或者UTF8编码,基本上就等同于GBK字符集或者UTF8字符集
我认为,字符编码是字符集的一种具体实现方式,你可以认为字符集是一种抽象的类,而字符编码则是具体的对象