字符编码问题总结

http://www.regexlab.com/zh/encoding.htm

http://bbs.sinobuy.cn/index.php?topic=12326;prev_next=next

字符编码或者字符集由编码组成,代码使得某一字符序列匹配于一指定集合中某一东西,例如可能显示为一种自然数序列,交流所用的字母表或者字音表) 到一个给定的集合中的其它东西,如一个自然数序列、8位字节或者电脉冲,以便于文本在计算机中的存储和通过通信网络的发送。常见的例子包括将拉丁字母表编码成一些列长短发报电键的Morse码和ASCII,ASCII将字母、数字和其它符号编码成整数和用7位二进制表示的这个整数,通常使用另外一个扩充的0位以便于用8位字节存储。在计算机技术发展的早期,诸如ASCII(1963年)和EBCDIC(1964年)这样字符集的引入开始成为标准化的过程。这些字符集的局限很快就变得很明显,于是人们开发了许多临时的方法来扩展它们。对于支持包括东亚CJK字符家族在内的多用写作系统的需求要求支持更大量的字符,并且需要一种系统而不是临时的方法实现这些字符的编码。

以下是整理:

通常所说的字符编码指不同语言的字符集在计算机里储存的方式,即一个实际的字符被储存为一个字节或多个字节序列。标准的ASCII码只占7位(储存为一个字节时第8位用0填充),共128个字符, 包含了拉丁字母,数字,一些特殊符号和控制符号,适合以英文为基础的一般使用。由于计算机使用8位为一个字节,所以有所谓的扩展ASCII,添加了128个字符,包括一些带变音符号的拉丁字符,制表符号和其他特殊符号。扩展ASCII在DOS时代被广泛采用(有时也称为ANSI),例如,很多DOS下漂亮的界面菜单其实都是用扩展的制表符号“画”出来的(也因此在现在的一些文本或程序里有时会看到本来是表格的位置出现了乱码)。

计算机开始在非英语国家普及后,非英语字符的编码问题就出来了。对于大部分字母为基础的语言(主要是以拉丁字母为基础的欧洲语言,也包括其他一些如使用西里尔字母的东欧语言,泰语,阿拉伯语,希伯来语),字符不是很多,所以可以保证标准ASCII的字符编码(0~127)不变,把新增的字符填到另外128个编码位(128~255)。这样,所有的字符还是单字节编码,这就是所谓的ISO8859系列,在Windows系统中广泛采用。值得一提的是,ISO 8859-1是Windows和Internet上常用的西欧语言编码,包括英语,但是和DOS时代的扩展ASCII编码不同。

另一些语言,如越南语,印度的几种语言,字符太多,东亚CJK(中,日,朝韩)语言更是如此,单字节编码已经远远不够,因此用上了多字节编码,为了与ASCII兼容,一般尽量不动标准ASCII部分的编码,而把其他编码位用作多字节编码。这样,ASCII的文本在这些语言系统中仍可正常阅读。这样得到的是变长度的编码(举例来说,在以GB2312编码储存的文本中,英文字母对应一个字节,汉字对应两个字节)。

在Windows95/98时期,由于每种语言都用了特定的编码方式,每个国家/地区销售的Windows95/98分化为相应的语言,无形中造成了计算机世界的分隔:一种语言的文本或程序,在另一种语言的系统上只看到乱码。如果不借助特殊的软件(南极星之类),不同国家/地区的文化几乎无法在计算机上交流。另一个严重的问题是,不同语言混合的文本(例如汉语与希伯来语)无法使用同一编码储存,这对于文化的交流是很不方便的。

很自然的可以想象,应该有一种统一的编码包含所有语言的字符,这就是所谓的Unicode。目前在计算机上常用的Unicode实现方式包括UTF-8,UTF-16。UTF-8是变长的编码,与ASCII兼容。UTF-16则是等长的,所有字符都对应两个字节(因此与ASCII不兼容)。UTF-16还有所谓big-endian与little-endian之分,代表了PC和苹果机(还有其他机种)对多字节数据的哪个字节是高位的定义不同(其实是历史遗留问题)。Unicode在Windows2000/XP得到了广泛应用,事实上,不同国家/地区销售的WindowsXP之不同之处仅在于菜单显示而已(其实我觉得,这时候还把操作系统分为不同国家/地区的版本完全是人为的,可能是商业策略)。

现在的情况是,各种编码与UTF-8,UTF-16同时存在。在WindowsXP中,可以选择非Unicode程序使用的语言,系统通过代码页的方式转换成Unicode,从而正常显示。一些软件(如IE)可以自动判断选择以何种编码显示文本,而自动判断常有不准,需要人工选择。理想的情况是,所有的文本和程序都使用Unicode为基础的编码,但是目前困难还很多,有历史遗留的原因,也有一些国家/地区抵制的因素。

(如果你看得厌倦了,下面将说到有用的内容)

中国用户常见的编码方式:
. 扩展ASCII(纯DOS程序)
. ISO 8859-1(英文为主的西欧语言文本,程序)
. GB2312(最早的简体中文编码,现在还广泛使用,也包括一些其他语言如俄语字符)
. GBK(有时称为GB13000,与GB2312兼容,不是国家正式标准)
. GB18030(最新的简体中文编码,与GB2312和GBK兼容,字库巨大,包含很多其他语言字符,与

Unicode相当,据称现在要在大陆获得销售许可的软件必须支持GB18030)
. Big5(繁体中文编码,除基本标准外,有众多增补版本,不同的增补版互不兼容)
. Shift-JIS(日文常用编码)
. EUC-JIS(日文编码,使用不如Shift-JIS广泛)
. UTF-8(目前使用最广泛的Unicode编码,汉字编码为三个字节而GB码只要两个,这也成为了某些抵制Unicode的理由)
. UTF-16(Unicode编码,有big endian和little endian,所有字符编码为两个字节,包括拉丁字母)
最新版本的Unicode包含了GB18030所有的字符。

编码只是字符储存的方式,要将字符在屏幕或打印机上显示出来,需要用到字体。软件选择的字体不包含需要的字符时不能正常显示(可能显示为空格,方框或乱码)。当然字体文件越大,包含的字符越多能显示的也越多,但是过大可能对计算机空间,速度造成负担,所以大多数字体只包含本国语言与少量其他语言的字符。

与编码有关的常用程序:

Notepad(记事本)
储存时可以选择使用的编码方式,不过其名称很不标准:
ANSI->当前设置的非Unicode程序区域对应的编码,如果设置成中国则使用GB2312(还是GB18030 没试过)
Unicode->UTF-16 little endian
Unicode big endian->UTF-16 big endian
UTF-8
选择ANSI以外的方式,储存的文本会被加上三个字节的文件头以表示文件为Unicode编码,记事本可以识别文件头不显示,但是用其他软件打开文件头可能会造成问题。没有文件头的时候,程序也会根据内容自动判断是否Unicode,文本内容很少时自动判断很容易错。那个流传的谣言,说记事本输入联通后,保存再次打开发现烧焦的手机电池(其实不一定是这个,与记事本设置的显示字体选择有关),实际上是保存时用了GB2312(区域设置为中国),再打开时被误判为UTF-8。

IE(其他浏览器应该也一样)
观看网页时可以选择编码。
另一个有用的功能是,可以打开文本文件(.txt),选择编码显示,在需要看异国语言的文本时很方便。
另存为文本文件的时候可以选择编码,因此可以用作文本的编码转换。
这样的方式转换成UTF-8编码的文本不带文件头,与记事本不同。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值