对ASCII、GB2312、Unicode、UTF-8的理解
ASCII:美国标准信息交换代码,用一个字节来表示,每个数字对应一个字符,类似于对应表,操作系统根据数字来显示对应的字符,美国只用了0-127
GB2312:由于汉字太多了,一个字节不够用,咱们就学ASCII自己定了一套编码库,收录了咱们常用的汉字和部分其他文字
Unicode:世界上还有很多国家民族也要在计算机中显示自己的文字,于是大家就各自弄了一套自己的字符集,比如中国大陆的GB2312,这样的话,冲突在所难免,所以国际上就弄了个统一的Unicode,把所有的文字包括进去并且保证不冲突,Unicode本质上也是一个对应表,最开始是2个字节,最多表示65536个字符,范围0x00-0xFFFF,后来进行了扩展,变成了0x00-0x10FFFF,现在能表示17*65536=1114112个字符,基本上把世界上所有的文字都包括进去了
UTF-8:Unicode的范围是0-1114112,这就出现一个问题,英文字母由于比较少再加上计算机起源美国,所以美国人一般只用到0-127,0-127用一个字节就能表示,而汉字由于比较多,再加上很多繁体字生僻字编码比较靠后,很多都是3字节甚至4个字节,当我们保存Unicode字符集的字符串数据时,就要考虑用几个字节来表示,如果用1个字节的话,汉字就没法保存了,如果用4个字节的话,英文就大大的浪费了,所以UTF-8就出现了,它则是基于Unicode字符集的一种编码实现,大致思路是在二进制位中标记共有几个字节,并将原Unicode的字节填充进去,这样就能用一个字节来保存英文字母和数字,用3-4个字节来保存中文了,规则如下:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的Unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的Unicode码
最终的UTF-8模型如下,其中x用来填充Unicode码,首字节开头的1用来标记有几个字节,0后面的是数据,非首字节开头用10来标记,后面也是数据
1个字节,则0xxx xxxx
2个字节,则110x xxxx 10xx xxxx
3个字节,则1110 xxxx 10xx xxxx 10xx xxxx
4个字节,则1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx
将UTF-8中除x外的固定位移除再连接起来就是Unicode码了
GBK:GBK是GB2312的扩展,GBK 向下与 GB 2312 编码兼容,向上支持 ISO 10646.1国际标准,是前者向后者过渡过程中的一个承上启下的产物
GB18030:对GB23120完全向后兼容,与GBK基本向后兼容,并支持Unicode(GB 13000)的所有码位
UTF-16:Unicode的另一种编码方式,不过不常用
--------------个人的粗浅理解,可能有不准确的地方---------------
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~