深入理解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。
推荐阅读
-
本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ...
[详细]
蜡笔小新 2024-12-25 04:11:22
-
本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ...
[详细]
蜡笔小新 2024-12-26 12:24:25
-
-
本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ...
[详细]
蜡笔小新 2024-12-28 10:36:30
-
SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ...
[详细]
蜡笔小新 2024-12-25 19:26:39
-
本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ...
[详细]
蜡笔小新 2024-12-28 11:15:04
-
本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ...
[详细]
蜡笔小新 2024-12-28 09:46:23
-
本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ...
[详细]
蜡笔小新 2024-12-27 19:10:10
-
本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ...
[详细]
蜡笔小新 2024-12-27 13:14:08
-
本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ...
[详细]
蜡笔小新 2024-12-26 22:04:19
-
本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ...
[详细]
蜡笔小新 2024-12-26 19:26:18
-
本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ...
[详细]
蜡笔小新 2024-12-26 13:12:48
-
本文介绍了如何通过扩展 UnityGUI 创建自定义和复合控件,以满足特定的用户界面需求。内容涵盖简单和静态复合控件的实现,并展示了如何创建复杂的 RGB 滑块。 ...
[详细]
蜡笔小新 2024-12-26 08:36:29
-
本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ...
[详细]
蜡笔小新 2024-12-25 19:15:51
-
本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ...
[详细]
蜡笔小新 2024-12-27 18:59:50
-