ANSI与GB2312的编码问题

前两天和Francis讨论字符编码的问题一直到深夜1点,主要是为了解决php读取文件的一个问题。可惜最后这个问题暂时没解决,先抛开这个问题,我在这里总结一下我对字符编码的认识。

文件编码与字符编码

首先明确一点,文件不存在什么编码(归根结底文件都是二进制文件,用ue打开可以看到都是一个个的16进制数),只有文件中的字符才可以说编码。

编码与解码过程

字符通过某种编码组织起来存到文件里面,计算机通过这种编码解析解析文件,根据解析出来的文字绘制图片显示到显示设备中,这样我们就看到了文字。

常见编码介绍

ansi编码

最初的计算机是又8个晶体管,通过晶体管的开合与排列可以表示数种状态,所以一个字节就定义为8bit,而一个bit只能有0,1开关的表示,2的8次方是256,所以最初的计算机只能表示256种状态。

人们定义了前32个为状态字符比如翻页,换行,发出(嘟)的声音等,后来人们为了用计算机存储文字,又把空格,英文字母,数字等加进了进来,总共使用了127个,这时候大家把这个存储方案叫做ANSI的ASCII编码[American Standard Code for Information Interchange,美国信息互换标准代码](http://www.dreamdu.com/xhtml/ascii/),这个表存储英文已经没有 问题了,但是127个里并不包含其它欧洲国际的文字,人们又继续扩展ASCII表的内容,加入了一些字符,与一些画表格的符号,直接扩展到255个。

GB2312与GBK

国人发现只使用ASCII表根本无法表示汉字!怎么办?没有什么能难道我们!于是我们发明了GB2312编码,此编码完全忽略了ASCII表中 127位后面的内容,127位前面的内容保留,如果两个字节同时大于127(7F)就认为这两个字节表示一个汉字,同时像标点、字母也都重新使用两个字节 定义了一遍,这就是我们经常说的 全角,这种方案可以表示6000种文字。

但是中国的文字太复杂6000个字也不够用,人们开始扩展GB2312,规定只要一个字节大于127,这个字节和后面的字节组合起来就代表一个汉字,这种编码成为GBK,于是又增加了20000多个汉字!

现在明白meta的编码信息里为什么有GB2312与GBK了吧?:)

<meta http-equiv="content-type" content="text/html; charset=GB2312" />
<meta http-equiv="content-type" content="text/html; charset=GBK" />

这样很多国家都开始定义自己的编码了,日本,韩国等。甚至连中国的台湾省都定义了一种编码 BIG5。所以在当时一个程序要想适应多国语言简直要把人郁闷死。

如果搞过windows编程的人应该知道,win里面有多字节字符集MBCS(multi-byte character set)的说法,而且MBCS包含两种字符类型,单字节字符SBCS(single-byte characters set)和双字节字符(double-byte characters set)DBCS。我们的GBK与GB2312都是DBCS。所以我们在编程时经常遇到一个中文字符等于两个英文字符的事情。BIG5与日本韩国的编码也 都属于DBCS。

这下清楚了吧,根本没什么ansi文件或gb2312文件,文件打开时会根据操作系统的编码方式(就是安装在操作系统中的编码解析方式)来尝试打开文件,如果安装了中文编码,就把ansi文件当作中文打开,如果日文编码,就当作日文打开。

UNICODE与UTF-8

ISO最后提出了UNICODE(Universal Multiple-Octet Coded Character Set,简称 UCS)编码来解决所有的问题。

UNICODE编码方式规定使用两个字节(16位)表示表示一个字符,算算2的16次方是多少?原来ANSI规定的都扩充为2字节,并且把所有已知的语言都编码进UNICODE。UNICODE可以表示65536个字符。

这下多国语言程序开始高兴了,使用UNICODE全部搞定!于是微软重现编辑windows内核,完全使用UNICODE编码,搞过win编程的人应该都知道,以A或W结尾的函数,还有灵巧的_T宏吧?

虽然UNICODE有很多优点,但是缺点也不少,我先总结我知道的两点:

1,狂占空间,以前一个字节可以表示,现在却要用两个字节了,网络上有80%属于英文字符,这下网络几乎要扩大一倍!

所以又有人研究出来了UTF-8(Unicode Translation Format - 8)编码,UNICODE转换格式,对于常用字符使用单字节,汉字等使用双字节。8代表每次在网络上传输8位,如果是UTF-16就是每次传输16位。搞 过网络编程的朋友应该知道,字节序(就是字节的排放顺序)分为两种,主机字节序与网络字节序,就是大头(俗称)在前,小头在前的问题,在网络上面传输的流 的字节序很可能是不一致的,于是需要使用一种方法通知接收端,传输流的字节序。有人发明了一种简单的方法,在每个流的开始加上FFEF或EFFF,分别主 机与网络字节序,我们可以使用记事本保存一个UNICODE文件,再使用ue打开看看(HEX方式打开)。所以有时候网页传到网上,在网页最开始的地方会 出现一个字符,这个有时候很令人费解。

用记事本新建立两个文件存为UNICODE与UNICODE big endian模式,输入梦之都,保存再用ue打开。

UNICODE

FF FE A6 68 4B 4E FD 90

UNICODE big endian

FE FF 68 A6 4E 4B 90 FD (观察,没两个字节和上面的对比)

2,UNICODE与GBK等两字节编码完全不兼容,无法找到一种简单的方式转换(只能使用查找表的方式)

这点我们可以使用记事本新建立两个文件一个ansi的文件,另一个utf8的文件,分别写入梦之都 ,保存。使用ue的hex模式打开我们会看到。

UNICODE

FF FE A6 68 4B 4E FD 90

ansi

C3 CE D6 AE B6 BC

猜编码

在windows系统中打开文件时,是使用了猜的方式选择解析文件内容编码系统,如果文件开头使用了FEFF或FFFE,win系统认为 UNICODE编码,否则为ANSI编码,如果是ANSI编码继续分析,如果一个字节大于127,就证明这个字节与后面的字节组成了一个汉字。

所以windows中文系统下,如果ansi文件,那么就会用gb2312方式转换,如果是日文系统,就会使用日文方式转变,但是绝对不能说ansi文件里面有中文字符就是gb2312!一个gb2312占用两个字节。而utf8 win系统在前面加了几个字节以示区别。

通过这种方式分析时会产生一个很著名的问题,如果用记事本输入“联通”保存,再打开,发现“联通”两个字没了!为什么没有了,大家可以自己分析一下。有人说这就是联通竞争不过移动的原因。 

通过这篇文章解决的网页设计中的问题

  • 1,一个汉字等于两个字符,对吗?
  • 2,为什么页面或页面的开始会有乱码?
  • 3,GB2312与GBK的区别
  • 4,为什么英文多的网站使用UTF-8比GB2312省空间?

转载于:https://www.cnblogs.com/aaaheng/archive/2012/05/16/2503580.html

【转】ANSI与GB2312的编码问题相关推荐

  1. [转]各种编码ANSI、GB2312、GBK、GB18030、UNICODE以及UTF-8傻傻分不清!

    计算机编程中的编码一直是让新手非常头疼的问题,特别是 GBK.GB2312.UTF-8 这三个比较常见的网页编码的区别,更是让许多新手晕头转向,怎么解释也解释不清楚,看一遍貌似懂了,但实际使用的时候又 ...

  2. 关于编码ansi、GB2312、unicode与utf-8的区别

     关于编码ansi.GB2312.unicode与utf-8的区别 2014-01-25 08:51 529人阅读 评论(0) 收藏 举报 本文章已收录于: 关于编码ansi.GB2312.uni ...

  3. AJPFX解析关于编码ansi、GB2312、unicode与utf-8的区别

    大家平时遇到乱码问题是否有自己的一套解决方案?这篇文章就是介绍一下常用的编码方式 关于编码ansi.GB2312.unicode与utf-8的区别 先做一个小小的试验: 在一个文件夹里,把一个txt文 ...

  4. QT乱码总结2.gbk和ANSI和gb2312的区别

    QT乱码总结0.Qt乱码产生因素 https://blog.csdn.net/liujiayu2/article/details/103167953 QT乱码总结1.Unicode 和 UTF-8 h ...

  5. 字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?

    字符编码知识:Unicode.UTF-8.ASCII.GB2312等编码之间是如何转换的? 字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得字符编码的知识.不注意的人可能对这个不在意,但这些 ...

  6. 【字符编码】 简洁理解ANSI,UTF8,Unicode,ASCII编码的差别

    目录 简略 说明 1.  ASCII和ANSI编码 2. UNICODE 4.  UTF-8 参考 简略 ASCII             1个字节=1个文字 ANSI                ...

  7. (转)js的编码成gb2312的编码函数(URLEncode)

    js的编码成gb2312的编码函数(URLEncode) 分类: JavaScript2014-05-15 08:24 776人阅读 评论(0) 收藏 举报 http://blog.csdn.net/ ...

  8. js的编码成gb2312的编码函数(URLEncode)

    擦,以前还没觉得,今天才发现原来在传参数取参数的时候asp.net内部会帮我们给数据编码!而且很无耻的是不能取消不让它自动编码解码. 比如search.aspx?key=中国,在传递过程中会自动先用U ...

  9. js对中文进行gb2312/gbk编码解码

    转载自:点击打开链接 有一个js编码库压缩包需要下载:点击打开链接 下载上面的压缩文件解压得到gbk.js文件,倒入gbk.js类库,调用$URL.encode将内容编码为gb2312字符串,调用de ...

最新文章

  1. Win7桌面快捷切换技巧?
  2. 038_JDK的Iterable接口
  3. C#获取控制台句柄的方法
  4. 语音特征提取: MFCC的理解
  5. 前端学习(2150):webpack之配置babel
  6. 2017模拟计算机考试试题,2017年计算机考试四级模拟试题及答案
  7. C语言程序设计 课程设计报告
  8. python爬取基金净值_Python爬虫周记之案例篇——基金净值爬取(上)
  9. python 谷歌地图_Python查询一个城市的谷歌地图的经度和纬度
  10. 新人如何快速融入团队
  11. HDU2063-过山车[Hopcroft-Carp]二分图匹配
  12. 计算机硬件系统维护经验与体会,计算机操作系统维护与优化的实训报告心得体会.docx...
  13. 我的翻转课堂教学实践
  14. 构词法重新辨析triweekly与entrance
  15. 八大基本数据类型之基本类型与包装类型的区别
  16. GC.SuppressFinalize()的正确用法
  17. ea测试软件,在EA测试过程中,如何获得99.9%的数据质量,提高EA测试的准确性?...
  18. 计算机共享账户密码删除吗,win10系统删除已记住的访问共享的账户与密码的详细技巧...
  19. 【苦练基本功】代码整洁之道 pt2(第4章-第6章)
  20. 为什么要升级BIOS呢?(1)

热门文章

  1. InChatter系统开源聊天模块前奏曲
  2. (三十三)设计模式之混合模式
  3. 事件绑定、事件监听、事件委托
  4. 使用共享网口方式访问BMC管理控制器
  5. Zabbix小版本升级
  6. 【shell】awk的next用法
  7. 《雪国》—— 读后总结
  8. 雅虎复兴无望,梅耶尔或离职
  9. 都快下班了,才来写日记
  10. 【知识小课堂】mongodb 之 查询关键词使用