ANSI编码


          在计算机中,无论是字符串、float、double或有符号整型,在存储和运算时都要使用二进制表示(因为计算机用高电平和低电平分别表示1和0)。可以用某固定长度的比特位代表不同的符号(英语字母、汉字或是简单的图形符号);具体用哪个二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),自己使用是没关系的,而如果要想互相通信而不造成混乱,几乎不能通讯,或代码的移植。那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了所谓的ACSII,统一规定了上述常用符号用哪些二进制数来表示。

       Ascii是American Standarded Code Informatin Interchange的简称, 是单字节的编码,只有256个字符(可见字符和不可见的控制字符),而日常使用字符远远超过这个数目,所以你见不着ascii的存储方式,不过基本所有编码方式都镶嵌了ascii的编码。

       如上所述,如果用一个字节表示一个字符,一般对英文(26个字母的大小写)是没问题的,然而对于中文或其他西欧国家的语言是远远不够的。  当然了,只使用ASCII表只能表示汉字的冰山一角,怎么办?于是我们发明了GB2312编码,此编码完全忽略了ASCII表中 127位后面的内容,127位前面的内容(包括各种标点符号和字母大小写,详见http://www.asciitable.com/)保留。只能增加字节数来扩充字符的容量,两个字节怎么样呢?如果两个字节同时大于127(7F)就认为这两个字节表示一个汉字,同时像标点、字母也都重新使用两个字节 定义了一遍,这就是我们经常说的 全角,这种方案可以表示6000种文字。但是我们的汉字还是太复杂了,6000个字也不够用,于是我们开始对GB2312进行 扩展 ,规定只要一个字节大于127,这个字节和后面的字节组合起来就代表一个汉字,这种编码成为GBK,于是又增加了20000多个汉字! 后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK 扩成了 GB18030。从此之后,中华各个民族的文化就可以在计算机时代顺利地传承了。

       这些使用 2 个字节来代表一个字符的各种符号(中文、韩文或日文等等)延伸编码方式,称为 ANSI 编码,ANSI码(American National Standards Institute),中文:美国国家标准学会的标准码
 

        为使计算机支持更多语言,更方便通讯交流,通常使用 0x80~0xFF 范围(也就是上面所说的大于十进制的127)的 2 个字节来表示 1 个字符。比如:汉字 '中' 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。 对于ANSI编码而言,0x00~0x7F之间的字符,依旧是1个字节代表1个字符。这一点是ANSI编码与Unicode(UTF-16)编码的最大也最明显的区别。比如“A君是第131号”,在ANSI编码中,占用12个字节,而在Unicode(UTF-16)编码中,占用16个字节。因为A和1、3、1这4个字符,在ANSI编码中只各占1个字节,而在Unicode(UTF-16)编码中,是需要各占2个字节的。

     
上面的提到的Unicode编码是下次要介绍的一种编码方式或实现方式(具体异同见下文)。

另:vc6.0默认是ansi编码,而vs2005、vs2008、vs2010默认是unicode编码,他们之间的代码移植还是应该注意一下。

### ANSI 编码简介 ANSI 编码并非一个具体的编码标准,而是一个通用术语,通常用于描述基于 ISO/IEC 8859-1 或 Windows 代页(如 CP1252)的字符编码方式。在实际应用中,“ANSI 编码”常被用来指代特定操作系统下的默认字符集编码[^1]。 在 Windows 系统中,ANSI 编码一般对应于代页 936(CP936),该代页使用 GBK 编码方式来表示中文字符和其他扩展字符集合。这意味着 ANSI页 936 实际上是对 GBK 的一种实现形式[^2]。 --- ### ANSI 编码的工作原理 ANSI 编码的核心在于通过单字节或多字节的形式对字符进行编码: 1. **单字节编码** 对于 ASCII 范围内的字符(0–127),ANSI 编码直接采用单字节表示法,这与 ASCII 完全一致。 2. **多字节编码** 针对超出 ASCII 范围的字符(例如汉字或其他语言字符),ANSI 编码会依赖于特定的代页定义。以 CP936 为例,它采用了双字节结构来表示汉字,其中第一个字节作为高位字节,第二个字节作为低位字节。 需要注意的是,不同操作系统的 ANSI 默认代页可能有所不同。例如,在西欧语言环境下,默认可能是 CP1252;而在中文环境中,则通常是 CP936。 --- ### ANSI 编码的实际应用场景 #### 文件处理 当创建或读取文本文件时,如果未指定其他编码格式(如 UTF-8 或 Unicode),许多程序会自动使用本地系统的 ANSI 编码。这种行为可能导致跨平台兼容性问题,因为不同的系统可能会有不同的默认 ANSI页设置[^3]。 #### 数据传输 在网络通信或者数据库交互过程中,某些老旧协议仍然依赖 ANSI 编码来进行数据交换。然而,随着全球化需求的增长以及对更多字符的支持要求提高,越来越多的应用已经转向更先进的编码方案,比如 UTF-8 和 UTF-16[^4]。 #### 开发工具支持 现代编程语言提供了多种库函数帮助开发人员完成各种复杂的字符编码转换任务。例如,在 PHP 中可以利用 `iconv` 函数将字符串从一种编码格式转换到另一种编码格式;而在 Java 中则可通过 Apache Commons IO 库中的 `FileUtils` 类轻松实现大批量文件编码格式更改操作[^5]。 ```php // 示例:PHP 将 UTF-16BE 编码的字符串转换为 UTF-8 编码 $str = iconv("UTF-16be", "UTF-8//IGNORE", substr($str, 2)); ``` ```java // 示例:Java 批量修改文件编码 (GBK -> UTF-8) FileUtils.writeLines(new File(utf8FilePath), "UTF-8", FileUtils.readLines(javaGbkFile, "GBK")); ``` --- ### 总结 尽管 ANSI 编码因其简单性和广泛适用范围曾经占据重要地位,但由于其局限性——无法有效覆盖全球所有语言文字的需求——如今已被更加灵活高效的编码体系所取代。不过,在一些遗留系统和特殊场景下,理解并掌握如何正确运用 ANSI 编码仍然是非常必要的技能之一。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值