字符编码学习和总结

字符集(Charset)和字符编码(Character Encoding)

  • 字符集(Charset):一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
  • 字符编码(Character Encoding):一套规则,能够对自然语言的字符的一个集合与另一个集合进行配对,即在符号集合和数字系统之间建立对应关系。

常见的字符集:ASCII字符集,GB2312字符集,Unicode字符集。

ASCII

ASCII字符集:主要包括控制字符(回车键,退格,换行建等);可显示字符(英文大小写字符,阿拉伯数字和西文符号)
ASCII编码: 将ASCII字符集转换为计算机可以接受的数字系统的规则。使用7位表示一个字符,共128个字符。后来为了表示更多欧洲的常用字符进行了扩展,使用8位表示一个字符,原来的字符最高位都是0,扩展的最高位置1.

Unicode

  • Unicode: 一个超大的包含所有符号的集合,可以容纳所有符号的编码。

但是Unicode只是一个字符集,它只规定了符号的二进制代码,却没有规定这个二进制代码如何存储。

比如,汉字”严”的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。

UTF-8

UTF-8是多种Unicode的存储方式的之一,也是目前互联网中使用最广泛的方式,除了它还有UTF-16(字符用2个或4个字节表示),UTF-32(4个字节)。

UTF-8是一种变长编码,可以使用1-4个字节表示一个符号,字节长度依符号不同而改变。

编码规则:
1. 对于单字节的符号,第一位设为0,后面7位是这个符号的Unicode码,于是对英文字母来说,UTF-8和ASCII码保持一致。
2. 对于n(n>1)字节的符号,第一个字节前n位设为1,n+1位设为0,后面所有字节前两位设为10,剩下的所有二进制位就是这个符号的Unicode码。

下面这个表总结了编码规则:

Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
——————–+———————————————
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

规则其实很简单:

if 一个字节的第一位是0
    这个字节单独表示一个字符
else//第一位是1
    连续有多少个1,就表示当前字符占用多少个字节。

举例来说,“严”的unicode编码是4E25(100111000100101),根据上面的表,4E25处于第三行的范围内,因此它需要3个字节,格式为”1110xxxx 10xxxxxx 10xxxxxx”。于是,把4E25的二进制从后往前依次填入,多余的补0,就得到”11100100 10111000 10100101”,转换成十六进制就是E4B8A5。

UTF-16和UTF-32

UTF-32使用4个字节的Unicode编码,非常浪费空间。
UTF-16做了改进,用2个字节来表示最常用的65535个字符,而在这65535个之外的字符需要用一些很诡异的技巧来实现。。

UTF-16和UTF-32的字符保存方式(大端模式,小端模式)

先说大端模式和小端模式,假设一个双字节的数0x1234,存放在内存0x1000开始的地方:
大端模式:
0x1000 - 0x12
0x1001 - 0x34
小端模式:
0x1000 - 0x34
0x1001 - 0x12

为了指示字节是怎么存储的,Unicode定义了一个特殊的非打印字符”字节顺序标记(Byte Order Mark),位于码点U+FEFF,它放在字节流的开头,标识字节流的字节序是大端模式还是小端模式。

如果前两个字节是0xFE 0xFF,则表示大端模式(UTF-16),
如果前两个字节是0xFF 0xFE,则表示小端模式(UTF-16)。
如果前三个字节是0xEF 0xBB 0xBF,则表示UTF-8编码。
。。。

reference

  1. 字符集和字符编码(Charset & Encoding)
  2. 字符编码笔记:ASCII,Unicode和UTF-8
  3. 字节顺序标记
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值