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中,就可以打印汉字了!

是不是可以打印汉字了?

你可能感兴趣的:(ionic2蓝牙打印无法打印中文的问题)