现在的位置: 首页 > 综合 > 正文

ansi编码

2013年12月11日 ⁄ 综合 ⁄ 共 2411字 ⁄ 字号 评论关闭

为使计算机支持更多语言,通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符。比如:汉字 '中' 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。

不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。
不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。

以上内容来自百度百科
ANSI编码

ANSI对于每一种语言都有不同的编码,同一个编码在不同的语言里会表示不同的文字。Windows本身通过Codepage来区分不同的编码,比 如简体中文常用的是GB2312- Codepage 936,西欧包括北美常用的是Codepage1252。但是ANSI文件本身又不带编码信息,对于文件的打开和保存都是通过系统环境和用户环境来决定 的。

也就是说打开ANSI文件时,系统或者说要带开文件的应用程序,都时通过用户的语言环境来猜测的。这就导致了语言环境切换之后打开ANSI文件很容易出现乱码的现象。
比 如一个用户在简体中文Windows下面用记事本输入一些汉字后保存,然后copy到另一台英文Windows上,尝试用记事本打开,就会发现出现的是一 些乱码。并不是copy的过程中出现了错误,而是因为在英文的Windows上打开文件时默认的ANSI编码是Wenstern European(Windows) - Codepage 1252,而在简体中文的Windows上保存打开时默认的编码格式是Chinese Simplified(GB2312) - Codepage 936。因为中日韩等东亚语系是双字节语系,一个汉字包括两个字节,而西欧拉丁语系则简单的多,本身字母不多,所以只采用了一个字节(最多256个符
号)。所以对于双字节的中文文本文件到了英文Windows下就变成了乱码。当然,中文文本文件在日文Windows上打开也会出现错误,因为同一个编码 在中文和日文Codepage可能代表两个完全不相干的字,即使打开,看到的也是完全不同的。

那么为什么在中文操作系统上保存的纯英文字符和数字的文件在英文的Windows里也能正确打开显示呢?而且反之亦然呢?那是因为在所有ANSI编码里,前127个符号都是相同的,而英文字母和数字都在这前面127个里面。

以上内容转
老徐的博客

ANSI编码不同于ANSI(American National StandardsInstitute,美国国家标准协会)。
     ANSI编码是个编码族,是各国(或地区)基于US-ASCII扩展而成的一套用连续两个或更多字节表达一个该国(或地区)特有字符的编码。
     因此,同样的连续两个字节,在中文操作系统、日文操作系统、韩文操作系统和台湾操作系统显示出来的字符不一样。例如0xC50xA9这两个连续的字符,在GB2312下是“农”,在BIG5下是“觼”,在韩文编码下是“?”。各操作系统会按照环境变量,读取这两个字节相应的字符库,从而显示正确的字符。换言之,在没有指定编码方式的前提下,多字节编码的文本毫无意义。
    为了消除多字节编码的“同样的数据文件显示为不同的文字”(也就是数据文件的语义依赖于编码方式)的问题,通常将各国的ANSI编码字符统一转换成Unicode编码。Unicode编码是“语言无关”的。
例如,
“农”的Unicode(Big Endian)是0x519C
“觼”的Unicode(Big Endian)是0x89FC

    在服务器开发时,如果客户机传送的是ANSI编码,则需要确定是哪一种ANSI编码。
    对于中文世界的程序,如果不考虑繁体字的话,一般是GB2312;代码为setlocale(LC_ALL,"zh_CN.GB2312")。通常可以写成setlocale(LC_ALL, "zh_CN")。
    如果出现简体繁体混杂的情况,这说明原来的ANSI编码并不是GB2312,而是更大的字符集,例如GB18030。
    1980年的GB2312收录了 7445 个字符,包括 6763 个汉字和 682个其它符号。目前手机等设备必须支持GB2312。
    GBK是微软公司在Windows95开始对GB2312的扩展。由于Windows的普遍使用,被接受为中国国家标准;收录了 21886个符号,它分为汉字区和图形符号区。汉字区包括 21003个字符。汉字区编码向下兼容于GB2312——也就是说同样的多字节数据在GB2312和GBK里表示同样的汉字。而且,由于是微软的扩展,在Windows里GBK沿用了GB2312的CP936代码页。
    2000年的GB18030取代了GBK1.0成为新的国家标准,收录了 27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。同样向下兼容于GBK和GB2312。现在PC必须支持GB18030,但手机等嵌入式设备没有强制规定,于是目前低端手机大多沿用容量较小的GB2312。
    因此,在PC上开发程序时,如果是中文世界的程序,在mbtowc前使用setlocale(LC_ALL,"zh_CN.GB18030")即可。
    PS:通常的Unicode指UCS16,也就是16个二进制位表示一个字符。UTF8是对Unicode编码进一步加工后的编码,可以很容易在没有字库表的情况下互相转换。之所以有个UTF-8,是因为UTF8里1个ASCII字符只有1个字节,1个汉字却有3个字节;而Unicode里均为2个字节。换言之,如果英文比较多,那么UTF8的数据量是Unicode的1/2;如果中文比较多,那么UTF8的数据量是Unicode的3/2。

抱歉!评论已关闭.