单片机源码中文多平台乱码问题

解决单片机源码中文乱码问题

标签:soucre insight 中文乱码 MDK UTF-8中文编译错误 utf-8 转 GBK

概述

这世界有不同人种,有不同国家。所以,在计算机界,对字符,也有不同的编码。

最早的是英文128个ASC码,后来多国语言的codepage,我们中国汉字从GB2312到GBK到GB18030编码,台湾F繁体汉字用BIG5编码。

在不同的操作系统编码也尽不相同。

Window默认的是ANSI编码,相当于codepage多国语言,中文GBK对应936页;Linux用的是UTF-8,虽然和unicode不是一个意思,但是在字库上,可认为就是unicode。

这也太为难我们了。这么办呢 ?我们从头说起。

刚学单片机

开始学单片机,用的肯定都是微软Window系统。

一开始大家都不知道文件有编码这回事,都是默认的系统编码,也就是ANSI,在我们国内的Window,文件中有汉字,ANSI其实都是GBK编码。

慢慢的,技术涨了,用上了soucre insight编码工具,导入的的源码一片乱码,惊慌失措。

百度一顿搜索,额,原来是这个工具soucre insight默认是utf8编码。

只要在:

Option-->Preferences-->Files的最下面,将Default encoding改为system default(widow ansi)

一切又如常了。

进阶LINUX

人人都说单片机工资低,没前途,最终,我们还是要进入Linux的。

这时候,你会发现,原来的代码进入Linux环境,像一坨屎,到处都是乱码。

原来是因为Linux用的是UTF-8编码,UTF-8是啥呢?先别管,先把这坨屎清理干净。

幸运的是,我们有NotePad++, 只要在菜单中的:

格式-- >转为UTF-8 无 BOM编码格式, 就可以将文件转为utf-8编码。

世界又恢复正常了。

那Window和Linux如何同步呢?

这就要说说UTF-8到底是啥?(utf-8其实是一种传输编码格式,实际存储的是unicode,他们有什么区别自己上网找utf-8 utf16 unicode的区别

简单的说,UTF-8是一个统一编码,只要各国人民各国系统用这种编码,就能正产沟通。

所以,只要我们在Window中的soucre insight环境中也用默认的UTF-8编码,世界就大同了。

世界大同

是的,把所有源码改为UTF-8无BOM编码后。再将Soucre Insight默认编码改为UTF-8。

源码确实不乱码了。

然并卵,在MDK中,编译,因为中文,报错。。。。。。竟然报错。

这时MDK已经被我们在:

Edit-->Configuration中的Editor中将Encoding改为Encode in UTF-8 without signature。

世界已经大同了,难道MDK就是不支持中文吗?

不懂,不懂,只好继续百度,

耶!有人知道如何解决。在MDK中:

Option-->C/C++中的Misc Controls中添加:--locale=english

编译通过。

--locale==english的作用是欺骗MDK,骗它我们是英语环境,不是ZH-CN环境。

解决了?no, no ,no ,太天真了

最后一公里

前面我们一直在解决Window和Linux开发环境不同的编码问题,最终方案选择了utf-8 编码。

然而,我们却忽略了我们的根本:单片机系统

是的,虽然代码在Window或Linux编译,但是,我们的目标系统,单片机系统,也是一个系统,那当然也有编码问题。

比如,我们测试程序会在LCD上显示中文。当我们把这个源文件转为 utf-8编码后,编译下载,LCD是不是乱码了?

为什么呢?因为:

未修改为UTF8之前:

ANSI编码的文件---->中文是GBK编码--->编译后得到的汉字内码是GBK----> 在LCD程序中用内码查询GBK点阵字库---->显示,正常,

现在:

UTF-8编码的文件---->中文是utf-8编码--->编译后得到的汉字内码是unicode----> 在LCD程序中用GKB定位法通过unicode内码查询GBK点阵字库---->显示乱码

怎么解决这个问题呢?

态度很重要,有两个态度:一了百了,或者得过且过

  • 一了百了

这个问题的根本原因是编码和点阵不一致。解决方法有2:

  1. 将unicode内码在代码中转换为GBK。
  2. 将点阵换位UTF-8定位的点阵。

方法1的缺陷是,unicode跟GBK之间没有一个公式进行转换,只能1对1查表,这个表很大额。但是如果本来系统就用到unicdoe转GBK功能,问题就不是问题了,否则,如果是小容量的单片机,还是放弃吧。

方法2的问题是,现在应该没有现成的字库。如果你动手能力强,会用python,可以尝试将一个GBK定位排布的点阵转为UTF-8编码定位排布的。

  • 得过且过

把这个文件改回ASNI编码。真的,不是忽悠,就这简单。管什么世界大同呢。

单独把一个文件改回ASNI后,在soucre insight中需要对这个文件单独选择编码方式,否则乱码:

首先双击对应的文件,让其变为当前编辑文件。

File-->Reload As Encoding,选择System Default(Windows ANSI)

后记

能用utf-8还是用utf-8,否则会处于鄙视链不利位置。

技术支持

可有偿提供GB18030汉字点阵。

关于点阵可参考:http://www.wujique.com/2021/05/15/elementor-811/


20210529

end