深入理解ASCII、ANSI、GB2312、UNICODE及UTF-8、UTF-16编码
作者:LA_Lam霸 | 来源:互联网 | 2024-11-13 07:33
本文回顾了作者初次接触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。
推荐阅读
-
本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ...
[详细]
蜡笔小新 2024-12-23 20:40:08
-
SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ...
[详细]
蜡笔小新 2024-12-25 19:26:39
-
-
本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ...
[详细]
蜡笔小新 2024-12-27 11:26:39
-
本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ...
[详细]
蜡笔小新 2024-12-26 16:36:34
-
本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ...
[详细]
蜡笔小新 2024-12-25 10:33:17
-
开发笔记:2020 BJDCTF Re encode ...
[详细]
蜡笔小新 2024-12-24 09:26:02
-
本文介绍如何使用 Android 的 Canvas 和 View 组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。 ...
[详细]
蜡笔小新 2024-12-23 10:12:53
-
本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ...
[详细]
蜡笔小新 2024-12-26 12:24:25
-
本文总结了导致网站乱码的常见原因,并提供了详细的解决方案,包括文件编码、HTML元标签设置、服务器响应头配置、数据库字符集调整以及PHP与MySQL交互时的编码处理。 ...
[详细]
蜡笔小新 2024-12-25 14:57:54
-
本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ...
[详细]
蜡笔小新 2024-12-25 04:11:22
-
本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ...
[详细]
蜡笔小新 2024-12-24 14:02:48
-
本文探讨了在 OpenStack 环境中使用虚拟机部署 Ceph 集群后,外部服务器通过浮动 IP 无法访问该集群的问题,并提供了详细的解决方案。 ...
[详细]
蜡笔小新 2024-12-23 18:54:47
-
本文详细介绍了如何将Struts和Spring两个流行的Java Web开发框架进行整合,涵盖从环境配置到代码实现的具体步骤。 ...
[详细]
蜡笔小新 2024-12-23 17:46:59
-
本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ...
[详细]
蜡笔小新 2024-12-23 14:50:23
-
对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ...
[详细]
蜡笔小新 2024-12-23 12:55:35
-