ASCII、ANSI、Unicode及UTF-8编码

ASCII、ANSI、Unicode及UTF-8编码

 

ASCII和Ansi编码

字符内码:指的是用来代表字符的内码.读者在输入和存储文档时都要使用内码,

内码分为:

单字节内码 -- Single-Byte character sets (SBCS),可以支持256个字符编码.
双字节内码 -- Double-Byte character sets)(DBCS),可以支持65000个字符编码.
前者即为ASCII编码,后者对应ANSI.

ANSI编码方案则包含有单字节内码、双字节内码、4字节内码等,具体使其代码页值而定。


不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码标准。ANSI编码方案实际上是包容了所有这些不同的国家和地区制定的不同的字符集。那它如何做到这一点呢?就用代码页这个变量来表示不同的字符集,即做不同的字符集的一个标识编号。例如,简体中文编码GB2312,实际上它是ANSI的一个代码页936。

在MBCS下,字符被编码为单字节或双字节。在双字节字符中,第一个字节(即前导字节)表示它和下一个字节将被解释为一个字符。第一个字节来自留作前导字节的代码范围。哪个范围的字节可以用作前导字节取决于所使用的代码页。例如,日文代码页 932 使用 0x81 到 0x9F范围内的字节作为前导字节,而朝鲜语代码页 949 则使用其他范围的字节。

http://blog.csdn.net/slj0609/article/details/2913146

https://msdn.microsoft.com/zh-cn/library/cwe8bzh0%28v=vs.80%29.aspx


不同的国家和地区制定了不同的字符集,一般都是多字节字符集(MBCS)。最常见的 MBCS 实现是双字节字符集 (DBCS)。例如,简体中文编码GB2312,就是一种属于双字节字符集 (DBCS)类型的字符集,即它包含用单字节内码表示的字符和用双字节内码表示的字符

简体中文编码GB2312规定:

一个小于127的字符的意义与原来(即"Ascii"编码(American Standard Code for Information Interchange,美国信息互换标准代码))相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组
合出大约7000多个简体汉字了。

在DBCS系列标准里,最大的特点是两字
节长的汉字字符和一字节长的英文字符并存于同一套编码方案里,因此他们写的程
序为了支持中文处理,必须要注意字串里的每一个字节的值,如果这个值是大于127
的,那么就认为一个双字节字符集里的字符出现了。

注释:

不知道是否有(中文)字符集存在如下规则:

字串里的每一个字节的值,如果这个值是大于127
且小于某一值A的,那么就认为从该字节开始的两个字节表示一个占用双字节的字符;
如果这个值是大于某一值A且小于某一值B的,那么就认为从该字节开始的4个字节表示一个占用4字节的字符。


多字节字符集(MBCS)包括

双字节字符集 (DBCS),即它包含用单字节内码表示的字符和用双字节内码表示的字符

单字节字符集 (SBCS),即它只包含用单字节内码表示的字符;

四字节字符集 (FBCS),即它包含用单字节内码表示的字符和用双字节内码表示的字符、4字节内码表示的字符.等等。



在计算机中字符通常并不是保存为图像,每个字符都是使用一个编码来表示的,而每个字符究竟使用哪个编码代表,要取决于使用哪个字符集(charset)。 

 在最初的时候,Internet上只有一种字符集——ANSI的ASCII字符集,它使用7 bits来表示一个字符,总共表示128个字符,其中包括了英文字母、数字、标点符号等常用字符。之后,又进行扩展,使用8 bits表示一个字符,可以表示256个字符,主要在原来的7 bits字符集的基础上加入了一些特殊符号例如制表符。  后来,由于各国语言的加入,ASCII已经不能满足信息交流的需要,因此,为了能够表示其它国家的文字,各国在ASCII的基础上制定了自己的字符集,这些从ANSI标准派生的字符集被习惯的统称为ANSI字符集,它们正式的名称应该是MBCS(Multi-Byte Chactacter System,即多字节字符系统)。http://blog.sina.com.cn/s/blog_72e928910100yklp.html


Unicode


 ANSI有很多代码页,使用不同代码页的内码无法在其他代码也正常显示,这就是为什么日文版/繁体中文版游戏无法在简体中文平台直接显示的原因.
    Unicode也是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方案.它是一种2字节编码,能够提供65536个字符,这个数字是不够表示所有的字符的(汉语就有55000多字符),所以,通过一个代理对的机制来实现附加的917476个字符表示,以达到所有字符都具有唯一编码.

Unicode和BigEndianUnicode 区别


    这两者只是存储顺序不同,如"A"的unicode编码为65 00 ,BigEndianUnicode编码为00 65

UTF-8

由于在Unicode中英文字符也是用两个字节表示,这有点浪费存储空间,所以UTF-8的设计时英文字符用一个字节表示(UTF-8保留了Unicode可以表示国际各种语言的字符的特性),这可以节省存储空间,网络传输量,毕竟网络传输多数是英文。


    UTF-8这是为传输而设计的编码,其系列还有UTF-7和UTF-16
    其中UTF-16和Unicode编码大致一样, UTF-8就是以8位为单元对Unicode进行编码。从Unicode到UTF-8的编码方式如下:
     Unicode编码(16进制)                                                              UTF-8 字节流(二进制)
     0000 - 007F (与ASCII字符集编码值相同的英文字符)        0xxxxxxx
     0080 - 07FF                                                                      110xxxxx 10xxxxxx
     0800 - FFFF                                                                     1110xxxx 10xxxxxx 10xxxxxx

  例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110110001 001001,用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

在utf-8里,通常使用 0x80~0xFd 范围的 2 个字节来表示 1 个字符。而0xFF和0xFE不用表示字符,而是组合起来表示一个标志位。??

 附加:

记事本也不甘心这样,所以它要支持Unicode,但是有一个问题,一段二进制编码,如何确定它是GBK还是BIG5还是UTF-16/UTF-8?记事本的做法是在TXT文件的最前面保存一个标签,如果记事本打开一个TXT,发现这个标签,就说明是unicode。标签叫BOM,如果是0xFF 0xFE,是UTF16LE,如果是0xFE 0xFF则UTF16BE,如果是0xEF 0xBB 0xBF,则是UTF-8。如果没有这三个东西,那么就是ANSI,使用操作系统的默认语言编码来解释。

Unicode的好处就是,不论你的TXT放到什么语言版本的Windows上,都能正常显示。而ANSI编码则不能。(UTF-8的好处是在网络环境下,比较节约流量,毕竟网络里英文的数据还是最多的)

Windows 记事本的 ANSI、Unicode、UTF-8 这三种编码模式有什么区别?


你可能感兴趣的:(ASCII、ANSI、Unicode及UTF-8编码)