重捡Unicode和UTF-8

为何进行编码

众所周知计算机的世界只有0和1,所以为了让计算机能表示我们人类能够理解的符号,我们必须做一些转换工作,所以编码就是指将人类认识的符号转化为0和1的过程

如何进行编码

这个问题笔者认为是真正理解编码的关键,网上查到这个问题的时候,就会出现很多常见的编码格式,如ASCII、ISO-8859-1、GBK、UTF-8和UTF-16等等,但这些是实现编码的具体方式,它们都有自己的“个性”,不利于我理解编码的本质,所以理解编码的最好方式是得搞懂编码的“共性”。

首先要理解三个名词:字库表编码字符集字符编码字库表是一个相当于所有可读或者可显示字符的数据库,字库表决定了整个字符集能够展现表示的所有字符的范围,通俗的理解就是字库表存储的是我们人类能理解的所有字符。编码字符集,即用一个编码值code point来表示一个字符在字库中的位置。字符编码,将编码字符集和实际存储数值之间的转换关系,就是编码字符集的实际存储方式。举个例子就好理解了:一般来说都会直接将code point的值作为编码后的值直接存储。例如在ASCII中A在表中排第65位,而编码后A的数值是0100 0001也即十进制的65的二进制转换结果,这也说明了ASCII中编码字符集和字符编码是相同的数值。所以像ASCII这样编码字符集和字符编码都相同的编码方式就会给我们编码是直接将字库表中的字符转化为字符编码的错觉。
**
读到这里可能有的小伙伴会有疑惑,为什么不直接把编码字符集存储就好,还要多一步转换为字符编码?在小范围的国家和地区中,字符编码确实就是编码字符集,这并没有什么问题,但是如果字库表覆盖的范围是整个世界的符号文字,这里以Unicode字库表为例子,排序最后的字符可能需要3-4个字节(取决字符在库中的位置),但是其实在一些地区他们不需要用到序号这么后的符号,如果直接用编码字符集存储的话,这样对于原本用仅占一个字符的ASCII编码的英语地区国家显然是一个额外成本(存储体积是原来的三到四倍)。所以需要改变一下实际的存储格式。

Unicode和UTF-8

理解完上面的概念,那么理解Unicode和UTF-8的关系就比较简单了,网上的有些资料在说明Unicode的时候会强调Unicode只是字符集,而UTF-8是其具体编码实现,这句话其实现在看来没错,但是如果没有上面的概念,笔者在理解的时候还是挺难的。Unicode就是上文中提到的编码字符集,而UTF-8就是字符编码,即Unicode的一种实际存储方式,UTF-16和UTF-32也是Unicode的实际存储方式之一。
**

UTF-8的编码方式

UTF-8的编码规则:

  • 如果一个字节,最高位(第八位)为0,表示这是一个ASCII字符,表示这是一个ASCII字符(00~7F)。所以所有ASCII编码已经是UTF-8了。
  • 如果一个字节以11开头,连续的1的个数暗示这个字符的字节数,例如110xxxxx代表它是双字节UTF-8字符的首字节。
  • 如果一个字节以10开始,表示它不是首字节,需要向前查找才能得到当前字符的首字节。

下面以中文“严”为例子:

“严”的 Unicode 是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800 - 0000 FFFF),因此“严”的 UTF-8 编码需要三个字节,即格式是1110xxxx 10xxxxxx 10xxxxxx。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,“严”的 UTF-8 编码是11100100 10111000 10100101,转换成十六进制就是E4B8A5。

UTF-16的编码方式:

UTF-16的编码规则:UTF-16是定长的表示方法,其用两个字节来表示Unicode码,不论什么字符都可以用两个字节表示,两个字节是16个bit,所以叫UTF-16。所以字母A的UTF-16表示为0041,相对UTF-8存储空间多了一倍。

参考文献:

http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
http://cenalulu.github.io/linux/character-encoding/
《深入分析JavaWeb技术内幕》 许令波著

原文地址:https://www.cnblogs.com/huangzefeng/p/10771549.html

时间: 2024-10-10 20:23:12

重捡Unicode和UTF-8的相关文章

ascii、unicode、utf、gb等编码详解

很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节".再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去.他们看到这样是好的,于是它们就这机器称为"计算机". 开始计算机只在美国用.八位的字节一共可以组合出256(2的8次方)种不同的状态. 他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端.打印机遇上约定

Unicode、UTF-8 和 ISO8859-1到底有什么区别

说明:本文转载于新浪博客,旨在方便知识总结.原文地址:http://blog.sina.com.cn/s/blog_673c81990100t1lc.html 本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 cec4",Unicode编码为"4e2d 6587",UTF编码就是"e4b8ad e69687".

java中的char中unicode和utf的关系

char是Java的基础类型(原类型 ),是字符类型.在Java中字符是基于Unicode编码的,所以一个Java的字符占2个字节,字符的内容存的是unicode的码值(二进制数字).问题来了,程序是怎么把unicode的码值转换为我们要的程序数据?例如:汉字的'汉'对应的unicode码值为:0x6C49.我们想要的程序数据为'汉',而计算机存储的为码值.如何把码值‘0x6c49’显示为‘字’,需要一个转换过程. 这个转换过程需要一个转换规则.转换规则的书面写法为UTF(UCS Transfo

Unicode 与 UTF 字符标准

Unicode 国际字符标准(UCS)是一个字符编码系统,它被设计用来支持世界各国不同语言书面文体之间的数据交换.处理以及显示.        Unicode用两个字节表示一个字符.前127个字符与ASCII标准一样,前256个字符符合ISO 8859-1标准.                UTF (UCS Transformation Format)提供的 Unicode 字符的表示法对文件系统都是安全的.UTF-8 使用一个字节表示常用的7位ASCII字符,用两个字节表示8位ASCII字符

Unicode 与 UTF

[UCS]   Universal Character Set (通用字符集) [UCS]   Unicode Character Set  (Unicode字符集) [UTF-8]Unicode/UCS Transformation Format-8 说明,由于UTF也适用于编码通用字符集UCS,故亦可称为『UCS transformation formats (UTF)』 Unicode(统一码.万国码.单一码)是一种在计算机上使用的字符编码.它是基于通用字符集(Universal Char

字符编解码的故事(ASCII,ANSI,Unicode,Utf-8区别)

好文分享UTF-8, 字符集, 编解码 (关于字符编码的深入解释,请参见我的原创文章<关于字符编码,你所需要知道的>.) 此文为转载,有少许修订,原文出处不详. 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们认为8个开关状态作为原子单位很好,于是他们把这称为"字节". 再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出更多的状态,状态开始变来变去.他们看到这样是好的,于是它们就这机器称为"

字符编码笔记:ASCII,Unicode和UTF-8

很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节". 再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去.他们看到这样是好的,于是它们就这机器称为"计算机". 开始计算机只在美国用.八位的字节一共可以组合出256(2的8次方)种不同的状态. 他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端.打印机遇上约

【转】【编码】ANSI,ASCII,Unicode,UTF8

不同的国家和地区制定了不同的标准,由此产生了 GB2312.GBK.GB18030.Big5.Shift_JIS 等各自的编码标准.这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码.在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码:在繁体中文Windows操作系统中,ANSI编码代表Big5:在日文Windows操作系统中,ANSI 编码代表 Shift_JIS 编码.不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,

各种编码UNICODE、UTF-8、ANSI、ASCII、GB2312、GBK详解

转自:http://blog.csdn.net/lvxiangan/article/details/8151670 GBK,ISO-8859-1,GB2312的本质区别编码有几种 ,计算机最初是在美国等国家发明的 所以表示字符只有简单的几个字母只要对字母进行编码就好 我们标准码 iso-8859-1 这就是一个标准但是后来计算机普及了 于是就中国要使用计算机了 但是机器不认得中文,于是就有了国际码. gbk gb2312都是这类.两个其实一个,一个是标准(发布的代号),一个是简称.后来多了个阿拉