美文网首页
ionic2蓝牙打印无法打印中文的问题

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

作者: 黑森林中的小木屋 | 来源:发表于2017-08-12 17:24 被阅读0次

    最近在做个项目,用到了蓝牙打印。一切都是从零开始。踩了很多坑,搞了好几天才搞好,现分享出来,让别人少走弯路!
    我用的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蓝牙打印无法打印中文的问题

          本文链接:https://www.haomeiwen.com/subject/cwejrxtx.html