PASSION之彻底看清编码

How does computor have encoding?

1,电脑最为底层都是数字电路的集合,电脑只能分辨0和1。而简单的数字电路的核心就是能分辨某个

     电平以上为高电平,而某个电平以下为低电平。我们将电路认识高电平和低电平的能力,映射到生活

     中就是0和1也可以是对和错等等。当我们将简单的数字电路组成复杂电路的时候,我们就可以通过排

     列组合的方式,来组织抽象生活中的信息,然后,用0和1的组合来完成组织。

2,将字符转化为二进制。

 

            几个概念?

 

            输入码:将键盘按键进行编码或者按键的组合进行编码。

            机内码:将每个字符进行二进制数字进行编号。

            输出码:将显示器上显示的字形进行编号。

            Unicode:英文为"Universal Multiple-Octet Coded Character Set",简称为UCS。   

 

现在用的是UCS-2,即2个字节编码,而UCS-4是为了防止将来2个字节不够用才开发的。UCS-2也称为基本多文种平面。
  UCS-2转换到UCS-4只是简单的在前面加2个字节0。(Unicode Character Set)
  UCS-4则主要用于保存辅助平面,例如Unicode 4.0中的第二辅助平面
   20000-20FFF - 21000-21FFF - 22000-22FFF - 23000-23FFF - 24000-24FFF - 25000-25FFF -      26000-26FFF - 27000-27FFF - 28000-28FFF - 29000-29FFF - 2A000-2AFFF - 2F000-2FFFF
    总共增加了16个辅助平面,由原先的65536个编码扩展至将近100万编码。
            兼容其他编码?

 

 

那么既然统一了编码,如何兼容原先各国的文字编码呢?
  这个时候就需要code page了。
  什么是codepage?code page就是各国的文字编码和Unicode之间的映射表。
    这其实也记事本可以另存为宁外一种编码格式的文本的原因
  比如简体中文和Unicode的映射表就是CP936,点这里查看官方的映射表。
    从936中随意取一行,例如:
    0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH
    前面的编码是GBK的编码,后面的是Unicode。
    通过查这张表,就能简单的实现GBK和Unicode之间的转换。
           Unicode转化为UTF-8(Unicode Transfer Format)?

 

 

例:
E4 BD A0        11100100 10111101 10100000
这是"你"字的UTF-8编码
4F 60          01001111 01100000
这是"你"的Unicode编码

按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000
把除了x之外的数字拼接在一起,就变成"你"的Unicode编码了。
注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。
经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。

以下是Unicode和UTF-8之间的转换关系表:
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

Unicode编码转换到UTF-8,简单的把Unicode字节流套到x中就变成UTF-8了。

可见,ASCII字符(U+0000~U+007F)部分完全使用一个字节,避免了存储空间的浪费。 而且UTF-8不再需要BOM字节。

另外,从上表中可以看出,单字节编码的第一字节为[00-7F],双字节编码的第一字节为[C0-DF], 三字节编码的第一字节为[E0-EF]。这样只要看到第一个字节的范围就可以知道编码的字节数。 这样也可以大大简化算法。

UTF-8的一个特别的好处是它与ISO- 8859-1完全兼容


          Code page?

 

 

1. Code page的定义和历史
字符内码(charcter code)指的是用来代表字符的内码.读者在输入和存储文档时都要使用内码,内码分为

单字节内码 -- Single-Byte character sets (SBCS),可以支持256个字符编码.  
双字节内码 -- Double-Byte character sets)(DBCS),可以支持65000个字符编码.主要用来对大字符集的东方文字进行编码.  
code page 指的是一个经过挑选的以特定顺序排列的字符内码列表,对于早期的单字节内码的语种,codepage中的内码顺序使得系统可以按照此列表来根据键盘的输入值给出一个对应的内码.对于双字节内码,则给出的是MultiByte到Unicode的对应表,这样就可以把以Unicode形式存放的字符转化为相应的字符内码,或者反之,在Linux核心中对应的函数就是utf8_mbtowc和utf8_wctomb. 
unicode、ucs-2、ucs-4、utf-16、utf-32、utf-8
Unicode是为整合全世界的所有语言文字而诞生的。任何文字在Unicode中都对应一个值, 这个值称为代码点(code point)。代码点的值通常写成 U+ABCD 的格式。 而文字和代码点之间的对应关系就是UCS-2(Universal Character Set coded in 2 octets)。 顾名思义,UCS-2是用两个字节来表示代码点,其取值范围为 U+0000~U+FFFF。为了能表示更多的文字,人们又提出了UCS-4,即用四个字节表示代码点。 它的范围为 U+00000000~U+7FFFFFFF,其中 U+00000000~U+0000FFFF和UCS-2是一样的。

要注意,UCS-2和UCS-4只规定了代码点和文字之间的对应关系,并没有规定代码点在计算机中如何存储。 规定存储方式的称为UTF(Unicode Transformation Format),其中应用较多的就是UTF-16和UTF-8了。

不难猜到,UTF-16是完全对应于UCS-2的,即把UCS-2规定的代码点通过Big Endian或Little Endian方式 直接保存下来。UTF-16包括三种:UTF-16,UTF-16BE(Big Endian),UTF-16LE(Little Endian)。

UTF-16BE和UTF-16LE不难理解,而UTF-16就需要通过在文件开头以名为BOM(Byte Order Mark)的字符来表明文件是Big Endian还是Little Endian。
Windows平台下默认的Unicode编码为Little Endian的UTF-16

 

       BMP?

  

Basic Multilingual Plane, 即BMP。或者说UCS-4中,高两个字节为0的码位被称作BMP。

将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。在UCS-2的两个字节前加上两个零字节,就得到了UCS-4的BMP。而

目前的 UCS-4规范中还没有任何字符被分配在BMP之外。

    UTF的字节序和BOM?

  

UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字 节序。例如“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流

“594E”,那么这是“奎” 还是“乙”?

Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,
而是Byte Order Mark。BOM

是一个有点小聪明的想法:

在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以

不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输 字符"ZERO WIDTH NO-BREAK SPACE"。

这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。

因 此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。

UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF 

BB BF(读者可以用我们前面介绍的编码方法验证一下)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是

UTF-8编码了。

Windows就是使用BOM来标记文本文件的编码方式的。

 

       为什么要使用Unicode? 

1) 可以很容易地在不同语言之间进行数据交换。 
(2) 使你能够分配支持所有语言的单个二进制.exe文件或DLL文件。 
(3) 提高应用程序的运行效率。 
Windows 2000是使用Unicode从头进行开发的,如果调用任何一个Windows函数并给它传递一个ANSI字符串,那么系统首

先要将字符串转换成Unicode,然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串,系统就会首先将

Unicode字符串转换成ANSI字符串,然后将结果返回给你的应用程序。进行这些字符串的转换需要占用系统的时间和内存

。通过从头开始用Unicode来开发应用程序,就能够使你的应用程序更加有效地运行。 
Windows CE 本身就是使用Unicode的一种操作系统,完全不支持ANSI Windows函数 
Windows 98 只支持ANSI,只能为ANSI开发应用程序。 
Microsoft公司将COM从16位Windows转换成Win32时,公司决定需要字符串的所有COM接口方法都只能接受Unicode字符串

 

 

           浅析记事本的工作原理?

 

            记事本process接收到来自键盘的中断,将键盘输入解析成对应的输入码,根据用户设定的编码

            方案来将输入码转化为对应编码(估计是通过一个输入机内关系码表来实现)的字节集合,现在

            linux/window系统都实现了unicode编码(包括文件夹名和文件名都是unicode编码),在记事本

            进程将输入码转化为unicode编码,而unicode point只是存在于内存中,这里可以与输出码直接

            进行转化,从而来通过显示器我们可以看到内存中数据的呈现形式。而我们知道unicode编码是

            将世界上所有的文字进行了编号,而且是每个文字固定的对应一个编号,这里我猜测现在的输出

             码是与unicode码进行对应,而不同编码的转化也有了可行的方法,因为unicode编码可以看成

             对字符的一种抽象,具体的实现由UCS(Unicode Character Set)-2或者UCS-4或者UTF-8

           (其实这里也是一个unicode码表和具体UTF-8码表的一个转化表来实现),而windows中利用

             code page来将不同的编码方式来对应其unicode码的一种实现,那么,有了code page我们就

             可以在不同的编码之间转化了。

 

            我们要明白一切的文本来自输入。但是,我们思考问题总是眼见为实,于是,我们理所当

                      然 为来源于显示器。这里我要纠正一个观点就是显示器显示的图像,这个图像就是应用程

                      序中内存中 数据的一个转化。那么,我们可以忽略这个转化。那么,我们将显示器上图像

                      直接映射到内存中的数据。我们操作电脑就:数据输入,CPU控制,内存存放数据,数据

                      输出。数据输入:键盘,鼠标,摄像头,扫描仪等,数据输出:硬盘,打印机,显示器等

                      输入详解:当按键盘中的一个键的时候,会引起一个中断,操作系统会将中断信息记录到

                      Top-half,将中断后具体的操作放到Bottom-half,而Top-half转入Bottom-half的操作,会有

                      操作系统来调度。

             

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值