最近在做個項目,用到了藍牙打印。一切都是從零開始。踩了很多坑,搞了好幾天才搞好,現分享出來,讓別人少走彎路!
我用的ionic2 藍牙打印插件為cordova-plugin-bluetooth-serial。
一開始,我是直接改的Java源碼,可以實現,但是IOS端我不知道怎么弄了,最后決定只改JS,不影響它的跨平臺性!
這個插件打印中文為亂碼,看他JS源碼:
..\plugins\cordova-plugin-bluetooth-serial\www\bluetoothSerial.js
問題一:編碼信息被切割,丟失!
里面用的是Uint8Array,也就是說,一個元素一個字節(jié),而漢字是2個字節(jié)。直接傳過去會被切割,后面一字節(jié)的信息會丟失。
比如:“?!钡膗nicode編碼為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中,就可以打印漢字了!