字符集编码浅谈:Unicode、UTF-8

近期在工作中遇到不少关于字符集问题。如果想要彻底的解决字符集问题, 需要对字符集原理有深入的了解。这篇文章主介绍字符编码涉及的概念,
后续文章会以Java字符编码作为切入点,结合代码范例,详述Java的字符集,编码解码的详细过程,加深理解!
首先,先了解字符集(CharSet)、编码方式(Encoding)、字形字体(Font)的概念

一:字符集(CharSet)

charset = char + set,char 是字符,set是集合,charset就是字符的集合。字符集就是是这个编码方式涵盖了哪些字符,每个字符映射唯一数字序号。

二:编码方式(Encoding)

编码方式就是一个字符要怎样编码成二进制字节序,或者反过来怎么解析。也即给你一个数字序号,要编码成几个字节,字节顺序如何,如何解码,或者其他特殊规则。

三:字形字体(Font)

根据数字序号映射到字体字形,就可以在页面上显示出来了。所以一个字符要显示出来,要显示成什么样子要看字体文件。

四:Unicode字符集

最早,Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码(一个整数),
以满足跨语言、跨平台进行文本转换、处理的要求。
所以,Unicode 只是字符集,而没有编码方式。但是要将Unicode字符集应用于计算机传输、解析,Unicode有它的致命缺点。
(1) Unicode字符集不兼容ASCII 。ASCII只需要一个字节,Unicode至少需要2个字节。
(2)由于Unicode字符集的编码长度不确定的,有的字符长度为2个字节,有的字符长度为3个字节,这给计算机解码带了困难。
于是,UTF-8应运而生,既兼容了ASCII,又解决了Unicode解码问题!

五:UTF-8编码

UTF-8是一种可变长的编码方式,一个字符可映射成1到4个字节。 UTF-8给每个字符映射的二进制码前加上一个标记,以便识别该字符占用的字节数,
这样就成功的解决了Unicode中的解码问题。
UTF-8 有以下编码规则:
(1)如果一个字节,最高位(第 8 位)为 0,表示这是一个 ASCII 字符(00 - 7F)。可见,所有 ASCII 编码已经是 UTF-8 了。
(2)如果一个字节,以 11 开头,连续的 1 的个数暗示这个字符的字节数,例如:110xxxxx 代表它是双字节 UTF-8 字符的首字节。
(3)如果一个字节,以 10 开始,表示它不是首字节,需要向前查找才能得到当前字符的首字节

用一句话总结:unicode是一个字符集,utf8是在这个字符集基础上的一种具体的编码方案。utf8解决了unicode字符集的解码问题。

参考文档:
https://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/
https://en.wikipedia.org/wiki/Unicode#Origin_and_development
http://www.zhihu.com/question/23374078

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值