ionic2蓝牙打印无法打印中文的问题

最近在做个项目,用到了蓝牙打印。一切都是从零开始。踩了很多坑,搞了好几天才搞好,现分享出来,让别人少走弯路!
我用的ionic2 蓝牙打印插件为cordova-plugin-bluetooth-serial

一开始,我是直接改的Java源码,可以实现,但是IOS端我不知道怎么弄了,最后决定只改JS,不影响它的跨平台性!
这个插件打印中文为乱码,看他JS源码:

..\plugins\cordova-plugin-bluetooth-serial\www\bluetoothSerial.js

问题一:编码信息被切割,丢失!

里面用的是Uint8Array,也就是说,一个元素一个字节,而汉字是2个字节。直接传过去会被切割,后面一字节的信息会丢失。
比如:“海”的unicode编码为28023 (charCodeAt()函数查看),但是传到Unit8Array中就会变成119,而119的二进制编码,跟28023的二进制编码的前8位相同。所以可以看出,后8位是被丢掉了
解决方法:将编码信息,比如 海 的28023转为二进制字符串(toString(2)),然后截取前8位,转换为整数(parseInt('0101101',2)),放到Unit8Array中(push),后8位同样的操作,若只有8位(不是汉字),则直接放入Unit8Array中

问题二:编码不对!

charCodeAt()返回的是Unicode编码,而打印机支持的大多为GBK/GB2312。就算解决了问题一还是乱码。这个时候需要转换编码!将unicode转为GBK的编码,从而让打印机识别。
那么,如何转换?我的做法是直接查表!

解决方法:

这是我在网上找的数组码表:http://download.csdn.net/download/chalson_007/3509567
该码表包含两个数组,分别为GBK编码,和Unicode编码。同一个汉字,在俩个数组中的索引相同,所以可以实现转换!

总结:

先转换编码(Unicode --> GBK),然后将转换后的编码信息,用问题一的解决方法存入Unit8Array中,就可以打印汉字了!

是不是可以打印汉字了?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容