前段時間在Android原生搞的BLE掃碼槍又要移植到小程式上來,本以為小程式不支持BLE的,結果一搜,還真支持-_-|| ,
藍牙部分問題不大,遇到的主要問題是,小程式環境如何對字符編碼進行判斷以及如何進行編碼轉文字的問題,
掃了一陣,搜到了TextDecoder,結果小程式環境不支持……,
隨后搜到了一個polyfill庫, 可以用于小程式,
https://github.com/inexorabletash/text-encoding
下載后的檔案包含
encoding.js 和 encoding-indexes.js 兩個檔案,
使用時
//只需要參考encoding.js,注意路徑 var encoding = require("../../libs/util/encoding.js"); var inputBuffer = new Uint8Array(); //utf8 var string = new encoding.TextDecoder().decode(inputBuffer); //gbk string = new encoding.TextDecoder("gbk").decode(inputBuffer);
坑:utf8編碼陣列 是能正確轉換的, gbk的不行,(2017 5月 v0.6.3 這個版本) 除錯了下,需要修改encoding.js檔案,不知道是不是個bug
//849行 return global['encoding-indexes'][name]; //修改為 return global['encoding-indexes']['encoding-indexes'][name];
另,中文編碼常用的有兩種“GBK”和“utf8”,因此對于輸入陣列還是要先做編碼判斷,才能正確轉換為文字,js版本的判斷utf8的函式也沒有搜到合適的,用之前java 的改了下,下面的親測可用,
isUTF8(buffer) { var isUtf8 = true; var end = buffer.length; for (var i = 0; i < end; i++) { var temp = buffer[i]; if ((temp & 0x80) == 0) { // 0xxxxxxx continue; } else if ((temp & 0xC0) == 0xC0 && (temp & 0x20) == 0) { // 110xxxxx 10xxxxxx if (i + 1 < end && (buffer[i + 1] & 0x80) == 0x80 && (buffer[i + 1] & 0x40) == 0) { i = i + 1; continue; } } else if ((temp & 0xE0) == 0xE0 && (temp & 0x10) == 0) { // 1110xxxx 10xxxxxx 10xxxxxx if (i + 2 < end && (buffer[i + 1] & 0x80) == 0x80 && (buffer[i + 1] & 0x40) == 0 && (buffer[i + 2] & 0x80) == 0x80 && (buffer[i + 2] & 0x40) == 0) { i = i + 2; continue; } } else if ((temp & 0xF0) == 0xF0 && (temp & 0x08) == 0) { // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx if (i + 3 < end && (buffer[i + 1] & 0x80) == 0x80 && (buffer[i + 1] & 0x40) == 0 && (buffer[i + 2] & 0x80) == 0x80 && (buffer[i + 2] & 0x40) == 0 && (buffer[i + 3] & 0x80) == 0x80 && (buffer[i + 3] & 0x40) == 0) { i = i + 3; continue; } } isUtf8 = false; break; } return isUtf8; }
本文來自博客園,作者:鍋叔
轉載請注明原文鏈接:https://www.cnblogs.com/uncleguo/p/16186906.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/463531.html
標籤:JavaScript
下一篇:瀏覽器播放rtsp視頻流解決方案
