字符编码个人理解

总结:ASCII码只占一个字节,不包含汉字;GBK汉字国标扩展码,就是所谓的中国码,兼容ASCII码,汉字包含两个字节;Unicode万国码,兼容所有国家文字;UTF-32,所有字符都占4个字节,导致资源浪费;UTF-8是针对Unicode的一种可变长度字符编码,一个US-ASCIl字符只需1字节编码,带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文等字母则需要2字节编码,中日韩文字、东南亚文字、中东文字等需要3个字节,少部分字符需要4个字节。

ASCII码(最早出现的)

它是最通用的信息交换标准,并等同于国际标准 ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符。

常见ASCII码的大小规则:数字< 大写字母 < 小写字母。

1.数字比字母要小。如 “7”<“F”;

2.数字0比数字9要小,并按0到9顺序递增。如 “3”<“8” ;

3.字母A比字母Z要小,并按A到Z顺序递增。如“A”<“Z” ;

4.同个字母的大写字母比小写字母要小32。如“A”<“a” 。

几个常见字母的ASCII码大小: “A”为65;“a”为97;“0”为 48 [4]  。

问题:

用128个符号编码便可以表示所有,但是用来表示其他语言,128个符号是不够的。比如到了中国,128个字符完全不够啊,怎么办呢?就有了GBK

GBK

GBK: 汉字国标扩展码,基本上采用了原来GB2312-80所有的汉字及码位,并涵盖了原Unicode中所有的汉字20902,总共收录了883个符号, 21003个汉字及提供了1894个造字码位。

GB2312和GBK

  • GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;GBK共收入21886个汉字和图形符号。
  • GB2312对任意一个图形字符都采用两个字节表示,并对所收汉字进行了“分区”处理,每区含有94个汉字/符号,分别对应第一字节和第二字节。GBK采用双字节表示,总体编码范围为8140-FEFE之间,首字节在81-FE之间,尾字节在40-FE之间。
  • 对于人名、古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBK 及GB18030 汉字字符集的出现。

GBK中如何区分中文和英文的呢?

很简单,比如底层是根据首位来判断是中文还是英文,汉字的第一个字节必须是1。如 我a你 ,会是1xxxxxxx xxxxxxxx 0xxxxxxx 1xxxxxxx xxxxxxxx ,1xxxxxxx xxxxxxxx代表一个汉字,0xxxxxxx代表一个英文字符,1xxxxxxx xxxxxxxx又代表一个汉字

问题:

gbk基本包含了所有的汉字,但是到了其他国家呢?比如日文、韩文、阿拉伯文等的字符又没有,怎么办?有用另一套字符编码,每个国家都整一套,那不乱套了吗?所有出现了Unicode.

Unicode

世界上存在着多种编码方式,在ANSi编码下,同一个编码值,在不同的编码体系里代表着不同的字。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码,可能最终显示的是中文,也可能显示的是日文。在ANSI编码体系下,要想打开一个文本文件,不但要知道它的编码方式,还要安装有对应编码表,否则就可能无法读取或出现乱码。为什么电子邮件和网页都经常会出现乱码,就是因为信息的提供者可能是日文的ANSI编码体系和信息的读取者可能是中文的编码体系,他们对同一个二进制编码值进行显示,采用了不同的编码,导致乱码。这个问题促使了unicode码的诞生。

如果有一种编码,将世界上所有的符号都纳入其中,无论是英文、日文、还是中文等,大家都使用这个编码表,就不会出现编码不匹配现象。每个符号对应一个唯一的编码,乱码问题就不存在了。这就是Unicode编码。

Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,“汉”这个字的Unicode编码是U+6C49。

问题:

Unicode固然统一了编码方式,但是它的效率不高,比如UCS-4(Unicode的标准之一)规定用4个字节存储一个符号,那么每个英文字母前都必然有三个字节是0,这对存储和传输来说都很耗资源。

UTF-8

UTF-8使用1~4字节为每个字符编码:

  • 一个US-ASCIl字符只需1字节编码(Unicode范围由U+0000~U+007F)。
  • 带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文等字母则需要2字节编码(Unicode范围由U+0080~U+07FF)。
  • 其他语言的字符(包括中日韩文字、东南亚文字、中东文字等)包含了大部分常用字,使用3字节编码。
  • 其他极少使用的语言字符使用4字节编码。

如何区分中文和英文的呢?

固定格式,一个字节以0开头,两个字节,第一个字节必须以110开头,第二个字节必须是10开头,三个字节,第一个字节必须是1110开头,第二个字节必须是10开头,第三个字节必须是10开头,如图:

0xxxxxxx 英文字符和数字 1个字节
110xxxxx 10xxxxxx 两个字节
1110xxxx 10xxxxxx 10xxxxxx 汉字 3个字节
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 4个字节

你可能感兴趣的:(Java,java)