字符编码 Unicode, ANSI, GBK, GB2312,UTF-8,区位码,

 

最近着手写一个记事本的程序,所以涉及到各种编码格式,这里总结一下网上查得资料:

 

::::全是个人理解

//

 

这里先说windows下记事本的几种格式:

   ANSI , 这是美国国家标准协会制定的编码格式,例如"A汉" 在这种编码方式下的内存值为 41 BA BA ,'A'占用一个字节,"汉"用两个字节,

而且 BA BA 正式 GBK内码的值, 那让我们先认识GBK编码. 

   GB2312,GBK,GB18030都是中国人自己发明的(中国之外并不使用的), 他们出现的时间顺序是GB2312 -> GBK -> GB18030 ,他们是包含关系,GB我猜是 "国标" 的意思 "k" 可能是 "扩展", 这些编码都是书面协议,要在计算机内部表示所以GB2312的内存值须在原来的每个字节值(区位码)上加0x80得到机内码,加上0x80是为了使得每个字节的最高位为1,这样就可以在内存中区分汉字和ASCII了[因为ASCII的最高位都为0]. 但是后来要在GB2312上扩展(得到GBK,GB18030),就需要更多的编码空间,所以GBK,GB18030就没有要求第二个字节的的最高位为1了,而是通过第一个字节来判断这是一个字节的ASCII还是两个字节的GBK.另外需要说明一点GB2312,GBK,GB18030是向下兼容的,例如 "汉" 在GB2312,GBK,GB18030中都是BA,BA .

   另外,GB2312,GBK并没有因为GB18030的出现退出市场,在一些嵌入式设备中还是应用广泛的,因为减少字库容量可以大大减少成本.

 

   回到之前的ANSI, 我们大概知道了GBK(不知道人们为什么喜欢用GBK而不是GB18030,姑且认为是GBK只有3个字母,书写方便吧!),那么ANSI又是怎么回事呢? ANSI就像一个指针,本身没有内容,如果指向"中国的编码",那么它就是GBK,如果指向"印度的编码",他就是x??x.也就是说在中国ANSI是GBK,在日本ANSI是XXX,在印度ANSI是???,但是他们在windows的记事本中都只能看到ANSI.但是ANSI也做了一些小的变动,就像刚才一样,'A'在内存中只占用了一个字节,也就是说ANSI = ASCII + 本地编码

 

Unicode:

   但是,我们怎么在一个汉语资料中书写日文符号呢?这时,Unicode出现了,不过它是谁发明的,反正Unicode把世界上的所有文字符号都包含进来了,不仅解决了刚才说的问题,而且程序员用Unicode写的程序可以在全世界的电脑上运行.C语言中用wchar_t表示.

 

UCS:

   据说UCS是和Unicode一样的工程,最后两个工程达成共识,所以编码完全兼容.所以我就把UCS看做Unicode.

   这里的UCS-2就是常说的UCS,只使用了两个字节保存一个字符,而UCS-4则是使用4个字节保存一个字符.

 

UTF-8:

   (ucs transformation format),为什么要创造UTF-8呢?其中一个原因是:0x00在C语言及操作系统文件名(等..)中有特殊意义(如字符串结尾),然而按照Unicode编码的话,很可能这个字符的第一个字节(高字节)为非零数值,而低字节为零,这样C语言就会误认为这是字符串的结尾.所以UTF-8的一个功能是保证Unicode编码表中不出现0x00(当然正常的0x00是可以的)

 

UCS-2编码,Unicode(16进制)   UTF-8  字节流(二进制)    
  0000   -   007F                    0xxxxxxx    
  0080   -   07FF                    110xxxxx   10xxxxxx                    (第一个1之后有几个1就表示后面还有一个字节,这里后面还有1个)
  0800   -   FFFF                     1110xxxx   10xxxxxx   10xxxxxx  (第一个1之后有几个1就表示后面还有一个字节,这里后面还有2个)

 应为UTF-8的这种编码方式,它不需要判断大小端模式,所以它是利于网路传输的(我也不知道是为什么)

 

 

   (BOM) EF   BB   BF ,我们可以通过BOM来判断文本是否为UTF-8编码格式.

 

 

打开一个文本文件时如何判断是何种编码呢?

1)提示用户选择编码类型

2)根据一定的规则猜测编码类型

3)检测文件头标识识别编码类型
EF BB BF      UTF-8
FE FF       UTF-16/UCS-2(Unicode), little endian,(在文件一个只含一个字母'A'的中文件中,文件内容为 FE FF 00 41 )
FF FE       UTF-16/UCS-2(Unicode), big endian,(在文件一个只含一个字母'A'的中文件中,文件内容为 FF FE 41 00 )
FF FE 00 00   UTF-32/UCS-4, little endian.
00 00 FE FF   UTF-32/UCS-4, big-endian.

 

        

         区位码        国标(GBK)        内码

   "汉" 1A1A       3A3A              BABA

 

         国标 = 区位码 + 0x20                   (每个字节)

         内码 = 国标(GBK)   + 0x80            (每个字节)

 

//

::::全是个人理解

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值