如何将字节编码数据转换为GBK或UTF-8格式的小程序?

2026-05-22 06:491阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计626个文字,预计阅读时间需要3分钟。

如何将字节编码数据转换为GBK或UTF-8格式的小程序?

在早期阶段,Android原生上通过BLE扫描二维码的方式又要移植到小程序上。由于小程序原本不支持BLE,经过搜索发现,还真支持_-||。蓝牙部分问题不大,主要遇到的问题是,小程序环境如何对字符编码。

  前段时间在Android原生搞的BLE扫码枪又要移植到小程序上来。本以为小程序不支持BLE的,结果一搜,还真支持-_-|| 。

  蓝牙部分问题不大,遇到的主要问题是,小程序环境如何对字符编码进行判断以及如何进行编码转文字的问题。

  扫了一阵,搜到了TextDecoder。结果小程序环境不支持……。

  随后搜到了一个polyfill库, 可以用于小程序。

  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

如何将字节编码数据转换为GBK或UTF-8格式的小程序?

//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; }

本文共计626个文字,预计阅读时间需要3分钟。

如何将字节编码数据转换为GBK或UTF-8格式的小程序?

在早期阶段,Android原生上通过BLE扫描二维码的方式又要移植到小程序上。由于小程序原本不支持BLE,经过搜索发现,还真支持_-||。蓝牙部分问题不大,主要遇到的问题是,小程序环境如何对字符编码。

  前段时间在Android原生搞的BLE扫码枪又要移植到小程序上来。本以为小程序不支持BLE的,结果一搜,还真支持-_-|| 。

  蓝牙部分问题不大,遇到的主要问题是,小程序环境如何对字符编码进行判断以及如何进行编码转文字的问题。

  扫了一阵,搜到了TextDecoder。结果小程序环境不支持……。

  随后搜到了一个polyfill库, 可以用于小程序。

  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

如何将字节编码数据转换为GBK或UTF-8格式的小程序?

//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; }