嵌入式领域编码合集(为什么中文会乱码)
一.基础概念
1. 字符编码的本质是什么?
字符编码本质上是“字符”到“字节”之间的映射规则。
-
计算机只能存储0和1(二进制),而“字母”“汉字”都是抽象的符号。
-
所以需要一套规定,把每个字符(比如“A”或“你”)对应到唯一的一串二进制码,这就是“字符编码”。
总结:传输的数据无论以何种格式显示,传输的过程都是二进制,接收显示只依赖于接收放的显示格式
二.常见编码
-
ASCII:只支持英文、数字和常用符号,占1个字节(8位)。
-
GB2312/GBK/GB18030:主要用于简体中文,汉字2字节,兼容ASCII。
-
UTF-8:国际通用,英文1字节,中文3字节(常用汉字),兼容ASCII。
-
Unicode编码:为了解决不同国家ANSI编码的冲突问题,Unicode应运而生
详细介绍可以看:字符编码ANSI和ASCII区别、Unicode和UTF-8区别_ansi编码-CSDN博客
总结:从包含范围看,Unicode = UTF-8 >GB2312(ANSI)>ASCII,简单解释就是ASCII码被任何一种编码格式包含且编译形式完全相同,所有英文怎么输出都不会报错。
Q1:那么中文为什么会报错呢?
-
你用中文(比如“你”)时,如果编码不同,它的字节序列就会变:
-
“你”在GB2312下=0xC4E3(2字节)
-
“你”在UTF-8下=0xE4BDA0(3字节)
-
-
如果发送的是GB2312编码的数据,而接收方用UTF-8解码(或反之),字节序列解释出来就是乱码。
Q2:ANSI和GB2312什么关系?
-
ANSI并不特指某一种具体的编码。 Windows 系统设置和文本编辑器(如记事本)中提到的“ANSI”编码,实际上指的是系统的当前“Windows 代码页”或“活动代码页”。
-
这个“活动代码页”会根据你的Windows系统区域和语言设置而动态变化:
-
如果你的系统区域设置是简体中文(中国),那么“ANSI”编码对应的就是
GBK
编码(GB2312的超集/扩展)。 -
如果你的系统区域设置是繁体中文(台湾),那么“ANSI”编码对应的就是
Big5
编码。 -
如果你的系统区域设置是日语,那么“ANSI”编码对应的就是
Shift_JIS
编码。 -
如果你的系统区域设置是西欧语言(如英语、法语、德语),那么“ANSI”编码对应的就是
Windows-1252
编码(它是 ISO-8859-1/Latin1 的超集)。
-
-
关键点: “ANSI”在这里是一个占位符,代表当前系统默认的本地化单字节/双字节编码。
Q3:为什么我修改了keil中的编译格式,改为GB2312还是乱码?
因为keil(其他软件也是)中的设置只是设置是以什么格式来显示代码中的字符,真正的传输格式开始Q3提到的,由于在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件。所有我们知道,不管软件是什么模式,文件保存就是UTF-8编码的格式。由于接收方不一定适配UTF-8格式(使用GB来解码),就会出现错误。
三.如何解决显示乱码问题
根据Q3的问题,我们知道根源是来自发送和接收的格式不匹配问题,所有我们只要使用文本编辑器,来打开目标源文件,另存为编码格式选择未(ANSi),保存后,中文就不会在乱码了。