深入理解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。
推荐阅读
-
线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ...
[详细]
蜡笔小新 2024-11-18 14:56:11
-
实现系统调用一、实验环境本次操作还是基于上次编译Linux0.11内核的实验环境进行操作。环境如下:二、实验目标通过对上述实验原理的认识,相信 ...
[详细]
蜡笔小新 2024-11-19 17:13:33
-
-
问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ...
[详细]
蜡笔小新 2024-11-21 15:14:45
-
探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ...
[详细]
蜡笔小新 2024-11-21 14:21:38
-
本题要求计算一组正整数的最小公倍数(LCM)。输入包括多组测试数据,每组数据首先给出一个正整数n,随后是n个正整数。 ...
[详细]
蜡笔小新 2024-11-20 15:52:47
-
原文地址:https:blog.csdn.netqq_35361471articledetails84715491原文地址:https:blog.cs ...
[详细]
蜡笔小新 2024-11-19 19:22:47
-
在Effective Java第三版中,建议在方法返回类型中优先考虑使用Collection而非Stream,以提高代码的灵活性和兼容性。 ...
[详细]
蜡笔小新 2024-11-19 15:31:16
-
本文探讨了在编译原理课程中遇到的复杂文法问题,特别是当使用SLR(1)文法时遇到的多重规约与移进冲突。文章讨论了可能的解决策略,包括递归下降解析、运算符优先级解析等,并提供了相关示例。 ...
[详细]
蜡笔小新 2024-11-19 14:44:19
-
mysql数据库json类型数据,sql server json数据类型 ...
[详细]
蜡笔小新 2024-11-19 11:05:28
-
如题:2017年10月分析:还记得在没有智能手机的年代大概就是12年前吧,手机上都会有WAP浏览器。当时没接触网络原理,也不 ...
[详细]
蜡笔小新 2024-11-19 08:36:41
-
题目编号:2049 [SDOI2008]Cave Exploration。题目描述了一种动态图操作场景,涉及三种基本操作:断开两个节点间的连接(destroy(a,b))、建立两个节点间的连接(connect(a,b))以及查询两节点是否连通(query(a,b))。所有操作均确保图中无环存在。 ...
[详细]
蜡笔小新 2024-11-18 20:11:35
-
在现代Web开发中,HTML5 Canvas常用于图像处理和绘图任务。本文将详细介绍如何将Canvas中的图像导出并上传至服务器,适用于拼图、图片编辑等场景。 ...
[详细]
蜡笔小新 2024-11-18 18:04:32
-
在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ...
[详细]
蜡笔小新 2024-11-18 16:46:17
-
oracle 对硬件环境要求,Oracle 10G数据库软硬件环境的要求 ...
[详细]
蜡笔小新 2024-11-18 15:17:57
-
本文以京东为例,详细探讨了电商中常见的高并发解决方案,包括多级缓存和Nginx限流技术,旨在帮助读者更好地理解和应用这些技术。 ...
[详细]
蜡笔小新 2024-11-18 14:59:39
-