查看: 727|回复: 0
打印 上一主题 下一主题

Arduino串口显示中文字符,简述Unicode、GBK、UTF关系

[复制链接] qrcode

37

主题

42

帖子

127

积分

注册会员

Rank: 2

积分
127
楼主
跳转到指定楼层
发表于 2016-4-15 01:52 PM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

图片看不到请戳 这里


Arduino串口如何收、发中文?相信还是有不少人困惑,明明简单的判断为什么Arduino就不行?


请看这段代码:

输出是这样的:

难道是串口无法输出中文?那么请看这段,它把串口收到的字符回显

按Ctrl+Shift+M(Windows 快捷键呼出串口调试窗口,Mac是。。。。) 不论输入中文、英文,都可以正常显示!

此处卖个关子,先聊下Unicode、GB2312、GBK、UTF-8,还有UTF-16、UTF-32之间的关系。

Unicode是一种编码,任何文字都可以用Unicode表示,并且唯一;同理,GB2312、GBK也是编码(GBK不是完全标准,它的后继GB ISO18030才是标准,但这个太长不好记,GBK好记所以流行,GB是国家标准的缩写,K是扩展(Kuo)的意思);而UTF是编码方式,把一个Unicode字符存储成不同的码流。如果Unicode是一本字典,那么UTF8、UTF16、UTF32就是拼音索引、笔画索引、部首索引,Unicode跟UTF编码都是一一对应的。UTF跟GBK、GB2312之间木有关系,因为GBK、GB2312用的是EUC-CN编码。。。。同样,GBK跟Unicode之间也木有关系,是两套完全不同的编码!UTF-16、UTF-32没有UTF-8用得多,本文主要介绍UTF-8,它是Arduino IDE的编码方式。

比如“中”国的中字,Unicode是"u4E2D",GB2312/GBK编码是"0xD6 0xD0",UTF-8编码是"0xE4 0xB8 0xAD",看不懂?换种写法:

仔细看UTF-8的二进制编码,如果这么看的话。。。

发现UTF-8跟Unicode是一样的。。。。 
由于Unicode是唯一的,所以UTF-8也是唯一的,全世界通用。

Unicode和UTF-8之间转换很容易,那么Unicode和GBK之间呢?很遗憾,没有简单函数关系。它们由两个不同组织定义,虽然我祖国地大物博,但定义Unicode时咱还木有出台正式编码标准!好在咱人员数量巨大,用的人多了,GB2312/GBK也就这么保留下来了。且这种编码方式比较适应国文,毕竟GBK编码中文绝大多数是2字节,而用UTF-8需要3字节。

说到这儿,因为Arduino IDE用的是UTF-8编码方式,也就有 strlen("中文测试")=12 这种奇葩的结果了!绝大多数中文字UTF-8编码都是3字节。

注:为什么说“绝”大多数是3字节,因为GB ISO18030定义有4字节文字,这部分文字映射到Unicode中保不齐有大于0xFFFF的!

那么如何解决这个问题呢?可通过建立Unicode到GBK之间映射,但对于Arduino这种存储空间有限,映射需要很大的空间。怎么办?编译前,把UTF-8的字符串转成十六进制不就好了。

写了一小段Python代码,不难懂,可以自己尝试一下:
  1. 下载Python 2.x (这段程序只需要2.7或以后版本就行)安装。
  2. 运行python utf8_2_gbk.py
  3. 输出转换后的文件,中文全部变成十六进制写法,并在每一行后添加注释。
  4. 注释的中文不转化。

下载地址:http://pan.baidu.com/s/1mhOc3pe   代码没经过严格测试,可能会有错误,担待。

修改后的代码(需要新建个目录保存):

结果

O了!

参考:
http://blog.itpub.net/55022/viewspace-713901
https://zh.wikipedia.org/zh/%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81
https://zh.wikipedia.org/zh-cn/EUC
https://zh.wikipedia.org/wiki/GB_18030


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表