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