计算机的编码问题,编程中的编码问题

      计算机只能处理0、1字符串,想在计算机中表示英文字母和符号就需要一套编码规则,将字符编码为对应的二进制串。美国最早制定的ASCII编码规则共256个字符,包含英语和西欧的各种符号。但是随着计算机普及,在计算机中表示其他国家的语言和字符,ASCII规则已经远远满足不了需求。
      因此,各个国家在ASCII规则的基础上设计了满足自己国家的计算机符号编码规则。我们知道,计算机以字节为单位存储字符数据,通常以8个二进制位表示一个字节,ASCII一个字符用一个字节表示,所以扩充ASCII编码主要有两种方式:1、将ASCII未利用的后128位利用起来。ASCII以8位表示一个字符,仍然按照8位一个字符的设计,向后添加符号编码。比如俄罗斯将第128号数字到256号数字编码为自己国家的符号。乌克兰将128到200号编码为自己国家的符号。2、扩展ASCII字符长度。可以用2个字节或者更长的字节表示一个字符,或者用变长字节表示不同字符。
      对于第一种扩充方式带来的问题就是:1、各国有着自己的编码,相同ASCII数字或二进制串在不同国家编码规则下表示为不用的语言符号,那么对信息进行转码时就需要知道信息采用了哪个国家的哪种编码,如果本地没有别国的编码格式,那么就无法正确解码别人的信息,比较麻烦。2、全世界编码格式繁多,解码十分麻烦。3、随着互联网的发展,各国信息交互频繁,经常进行编码转换极为繁琐和浪费时间。
      第二种扩充方式问题是:对于包含大量英文信息的长段文字会浪费二进制的高位,而且信息传输也会变慢。
      为了解决上面的问题,各国之间联合创建了一个统一的编码规则--Unicode编码字符集。Unicode包含了世界上所有国家的所有符号,并不断扩充。Unicode为各个国家对编码进行分段,每个国家的字符只占编码表的一部分且互相独立没有交叉。Unicode用2个字节为所有字符进行编码,且可以满足所有国家需要。但是Unicode并不兼容单字节编码的编码格式。UTF-8是一种变长字节编码,一个字符可能会用1-6个字节编码,兼容其它编码格式。现在常用的编码格式有ASCII、GBK、GB2312、UTF-8、UTF-16等。      
      由以上可知,现在的计算机是基于ASCII编码的,键盘的信号设计也是按照ASCII编码习惯来。键盘上有26个英文字母和其它基本符号,这些符号组成了基本的ASCII字符集。其它字符集通过组合按键和语言切换按键共同构成。键盘的每一个按键代表一组电信号,也就是一个ASCII二进制串。所以按下键盘的比如 A 键时,发送的就是一个ASCII二进制串。
      以按键A为例,A在ASCII字符集中二进制为0110 0000,当按下键盘上的A时,CPU读取键盘发送的二进制码0110 0000到操作系统中,之后操作系统按照默认的编码方式比如GBK编码规则,将该二进制码解码为GBK规则下的A字符,二进制串到字符的映射就基本完成了。
      编码的实质就是对计算机ASCII二进制串进行扩充和修改。比如有的编码规则将中文用2字节表示,即16位二进制串,有的编码规则则用3字节表示一个汉字,即24位二进制串。很显然当将更长的二进制串向更低的二进制串直接转化时肯定会出现截断转码问题并导致乱码。这只是从长度上看存在的问题,编码时不只是考虑长度,对于被扩充的二进制串的最高位或者某几位,不同编码规则也有可能有不同的规定,若直接转码势必造成乱码。
     因此,想在不同编码规则之间进行转换只能先把编码后的二进制码解码为ASCII码。
     举个例子,我在中国的一个页面编码规则为GBK编码的网站上通过敲键盘写了一篇文章,俄罗斯的人看我发的文章的汉字原文。这个过程就是:1、我键盘输入的文章先按照ASCII编码输入到我自己的电脑中,此时文章还没显示在我自己的屏幕上。2、然后我的电脑经过GBK编码将这篇文章编码出来先显示给我自己看。3、然后浏览器经过http将我的文章发送出去,http的content-encoding为GBK。4、俄罗斯那边通过自己的浏览器接受到了我的文章,假如他的浏览器默认编码为GB2312,那么他接受到的汉字文章在浏览器上就显示为乱码,这是因为浏览器将GBK的汉字内容直接转码为了GB2312的汉字。只有当他的浏览器编码也是GBK的时候,看我的文章才是汉字。平时我们看不到乱码就是因为现在所有浏览器都是自动检测http编码格式,并且自动根据编码格式进行解码,这才没有乱码。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值