深入理解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。
推荐阅读
2019独角兽企业重金招聘Python工程师标准一、准备工作1、下载ICSharpCode.SharpZipLib.dll文件2、项目中引用这个dll二、文件压缩与解压共用类 ...
[详细]
蜡笔小新 2024-11-14 10:37:34
开发日志:高效图片压缩与上传技术解析 ...
[详细]
蜡笔小新 2024-11-11 19:33:51
在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ...
[详细]
蜡笔小新 2024-11-11 12:12:04
在《Linux高性能服务器编程》一书中,第3.2节深入探讨了TCP报头的结构与功能。TCP报头是每个TCP数据段中不可或缺的部分,它不仅包含了源端口和目的端口的信息,还负责管理TCP连接的状态和控制。本节内容详尽地解析了TCP报头的各项字段及其作用,为读者提供了深入理解TCP协议的基础。 ...
[详细]
蜡笔小新 2024-11-10 14:18:44
大家好,我是归辰。秋招结束后,我已顺利入职,并应公子龙的邀请,分享一些秋招面试的心得体会,希望能帮助到学弟学妹们,让他们在未来的面试中更加顺利。 ...
[详细]
蜡笔小新 2024-11-13 18:41:58
众所周知,串口通信是MCU最基本的通信方式,对于STM32来说也是如此。本文重点讲述STM32单片机的串口通信,主要包括的内容是:通信基础知识、串口通信原理、USART有关寄存器和 ...
[详细]
蜡笔小新 2024-11-13 17:13:51
本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ...
[详细]
蜡笔小新 2024-11-13 16:43:07
本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ...
[详细]
蜡笔小新 2024-11-13 16:08:08
外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ...
[详细]
蜡笔小新 2024-11-12 19:51:29
本文介绍了单片机的基础知识及其应用。单片机是一种将微处理器(类似于CPU)、存储器(类似硬盘和内存)以及多种输入输出接口集成在一块硅片上的微型计算机系统。通过详细解析其内部结构和功能,帮助初学者快速掌握单片机的基本原理和实际操作方法。 ...
[详细]
蜡笔小新 2024-11-11 23:53:26
在本阶段的Java编程实战中,我们将深入探讨位运算的应用。具体任务是实现逻辑位运算。用户需从键盘输入一个位运算符(如AND、OR、XOR或NOT)及相应的操作数,系统将根据输入的运算符执行相应的位运算并输出结果。此练习旨在加强学员对位运算的理解和实际操作能力。 ...
[详细]
蜡笔小新 2024-11-11 15:54:28
在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ...
[详细]
蜡笔小新 2024-11-11 14:49:31
本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ...
[详细]
蜡笔小新 2024-11-11 14:44:47
Codeforces竞赛解析:Educational Round 84(Div. 2评级),题目A:奇数和问题 ...
[详细]
蜡笔小新 2024-11-11 14:02:18
提升视觉效果:Unity3D中的HDR与Bloom技术(高动态范围成像与光线散射) ...
[详细]
蜡笔小新 2024-11-10 10:16:00