热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入理解ASCII、ANSI、GB2312、UNICODE及UTF-8、UTF-16编码

本文回顾了作者初次接触Unicode编码时的经历,并详细探讨了ASCII、ANSI、GB2312、UNICODE以及UTF-8和UTF-16编码的区别和应用场景。通过实例分析,帮助读者更好地理解和使用这些编码。
几年前,我初次接触Unicode编码时,虽然解决了当时的问题,但对UTF-8编码的具体机制和与Unicode的关系仍存有疑问。最近遇到相关问题后,我决定深入学习这些编码的知识。 在早期编程时,我通常使用多字节字符集(MBCS),因为当时的开发环境(如VC6)默认设置为多字节字符集。如果要在VC6中使用Unicode字符集,需要在项目属性中进行特殊设置。随着VS2005的推出,默认字符集变为Unicode,且使用Unicode编译的GUI应用程序能更好地适应XP主题变化,无需额外的manifest文件。因此,我决定在所有项目中采用Unicode。 ### ASCII字符集 ASCII是一种7位编码方案,共表示128个字符,包括大小写字母、数字和常见标点符号,适用于英语世界。 ### ISO-8859-1字符集 也称ISO-Latin字符集,扩展了ASCII字符集,使用8位字节,共有256个字符,前128个字符与ASCII相同。ISO-Latin字符集覆盖了西欧语言如西班牙语、法语、德语和意大利语。 ### GB系列字符集 GB2312、GBK和GB18030是针对汉字的多字节字符集。由于一个字节无法表示所有汉字,这些字符集使用可变长编码,其中GB2312和GBK最多使用2个字节,GB18030最多使用4个字节。这些字符集的前128个字符与ASCII相同,且兼容。记事本在默认情况下使用多字节字符集保存文件,具体使用哪个字符集取决于系统设置。 ### Unicode字符集 Unicode旨在统一所有字符的编码,每个字符都有唯一的标识(代码点)。最初的Unicode设计使用2个字节表示所有字符,但后来发展出多种实现方式,如UTF-8、UTF-16和UTF-32。UTF-8使用1到4个字节编码字符,兼容ASCII,但不兼容ISO-Latin字符集。UTF-16使用2个或4个字节编码字符,UTF-32使用4个字节编码所有Unicode字符。 ### UTF-8编码 UTF-8由美国人提出,旨在减少存储空间的浪费。UTF-8编码中,U+007F以下的字符用1个字节表示,其他字符用2到4个字节表示。UTF-8编码的实现方式较为直观,例如,“汉”字的Unicode编码为6C49,最终编码为E6 B1 89。UTF-8编码不存在大端小端问题。 ### 字节序标记(BOM) BOM用于区分不同的Unicode编码方案。文件开头插入BOM后,应用程序可以识别文件的编码方式。ANSI编码的文件没有BOM。 ### 编程中的编码转换 在Windows平台上,可以使用WideCharToMultiByte和MultiByteToWideChar函数进行多字节字符集与Unicode编码之间的转换。例如,将MBCS转换为UTF-8,需先调用MultiByteToWideChar,再调用WideCharToMultiByte。 ### 记事本的“联通”BUG 记事本在打开文件时会尝试猜测文件的编码方式。如果文件以ANSI编码保存,但内容符合UTF-8编码规则,记事本可能会误判为UTF-8编码,导致乱码。通过强制指定ANSI编码打开文件可以解决这一问题。 ### 相关资源 - CSDN博客上的文章:《汉字编码及相关问题(unicode, ansi, gb2312)》和《关于编码: ascii(ansi), gb-2312, unicode, utf8》 - Joel on Software上的文章:《The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)》 - Unicode官方网站提供详细的Unicode规范和FAQ。
推荐阅读
author-avatar
LA_Lam霸
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有