本帖最后由 京小亿 于 2021-12-18 22:14 编辑
前言:
技术售后中,技术论坛上,经常有学习、使用Arduino的小伙伴咨询“怎样能让Arduino IDE输出中文字符串”的问题。归根结底就是Arduino IDE使用的UTF8编码,不支持GB编码方式。
UFT8和GB码的区别: UTF-8(Unicode TransformationFormat-8bit)是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。
UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。
GB2312编码适用于汉字处理、汉字通信等系统之间的信息交换,通行于中国大陆;新加坡等地也采用此编码。
GB的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示。
从文件大小看, UTF-8(更臃肿、加载更慢) > gb2312 (更小巧,加载更快)
不支持UTF8编码的设备
国内液晶屏内置中文字库绝大多数都是GB编码。这对于使用16进制串口数据的控制器没有问题。但ArduinoIDE使用的是UTF8编码方式(暂时没找到支持GB编码的版本之前有小伙伴说IDE1.8.15支持GB编码,我没用到过,有用过的小伙伴可以分享一下),导致Arduino IDE编程环境无法编辑GB码汉字的问题。Arduino里直接输出中文汉字时就会乱码。
为了解决这个问题,有很多朋友给出了多种解决方案:
有直接对汉字取字模的:
有建字符串数组的
也有直接将GB2312转成16进制的
更有大牛,直接修改Arduino IDE
为什么UTF8转成GB操作这么复杂?
主要就是因为UTF8编码是变长度的。它可能是一个字节,可以是两个字节、三个字节、四个字节、五个字节,最长六个字节。
举个例子:我们在ArduinoIDE中发送中文“试”,它的UTF8码值是:0xE8 0xAF 0x95一共是三个字节。设备接收端在接收过程中,刚收到两个字节(也就是0xE8 0xAF),此时对于判别UTF8编码是不符合规则的,但对GB码是合规的。如果按照GB码规格显示,这时候显示就是错误的。再到最后一个字节(0x95)进来时,就无法判别UTF8码了。
那么在Arduino IDE支持GB编码之前,有没有一种简便的方法,来解决中文汉字输出的问题? 答案就是:ATFC043串口智能屏。
Arduino IDE编译中文字符
这是Arduino IDE自带串口监视器的显示效果
这是ATFC043串口智能屏显示效果
ATFC043串口智能屏: 这款彩色串口屏是专门为Arduino平台开发的。和普通的串口屏相比,有两个最大特色:
1、应用简单:直接使用ArduinoIDE字符串打印模式输出。换句话说,用户不用写彩屏的代码,将彩屏接在Arduino UNO(或者其他控制器)的串口上,就可以像串口监视器(Serial Monitor)那样直接来显示串口数据。真正的“0”代码显示。
2、支持中文字符直接输出:我们再通过ArduinoIDE编译中文字符的时候,就不用再像前面那样,做一些转换的工作,同时支持UTF8和GB2312解码,直接在彩屏上显示中文字符。
这无疑对使用Arduino平台做创客项目的小伙伴带来很大的便捷。
|