--locale=english
概述
这世界有不同人种,有不同国家。所以,在计算机界,对字符,也有不同的编码。
最早的是英文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:
- 将unicode内码在代码中转换为GBK。
- 将点阵换位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)