微信小程序实现GBK和UTF-8互转

2023-10-27

js虽然有第三方支持的GBK工具,但是小程序没有;而我开发中又需要进行格式的转化,就依据前人的经验做了一份出来。

分为两部分:Decode.js和Encode.js。分别是GBK格式的二进制文件转化为UTF-8的String和反转。

import Encoder from "./encode/Encoder";
import Decoder from "./encode/Decoder";

//实现参考例子
var message = "减肥是一件困难的事情";

//UTF-8转GBK
var gbkArray = Encoder.hexstrToArray(Encoder.stringToGbkHexstr(message));
console.log("gbkArray>>" + gbkArray);
//GBK转UTF-8
var utfStr = Decoder.GBKHexstrToString(Decoder.binaryarrayToHexstr(gbkArray));
console.log("utfStr>>" + utfStr);

文件下载地址:GITHUB

Decoder.js 因为太长,所以只贴出关键代码

        /**
         * GBK二进制编码集合,转换成标准的javascript String输出
         */
        function GBKHexstrToString(input){
            if (input.length % 2 !== 0) {
                throw new Error('错误的输入:' + input);
            }

            var output = '';
            for (var offset = 0; offset < input.length;) {
                var value = input.substring(offset, offset + 2);
                offset += 2;
                if (value.charAt(0) < '8') {
                    output += String.fromCharCode(parseInt(value, 16));
                    continue;
                } else {
                    var low = input.substring(offset, offset + 2);
                    offset += 2;
                    value = value + low;
                    output += String.fromCharCode(GBKTable[parseInt(value, 16)]);
                }
            }
            return output;
        }

        /**
         * 将binaryArray转化成hexString
         *
         * @param array 输入的binaryArray
         * @returns {string} 输出的hexString
         */
        function binaryarrayToHexstr (array) {
            var output = '';

            array.forEach(function (i) {
                output += oneByteIntToHex(i);
            });
            return output.toUpperCase();
        };

        /***
         * 将一个字节的整型转换成16进制
         *
         * @private
         * @param i
         * @returns {string}
         */
        function oneByteIntToHex (i) {
            var output = '';
            i = parseInt(i);
            output += (i >> 4 & 0x0f).toString(16);
            output += (i & 0x0f).toString(16);
            return output.toUpperCase();
        };

module.exports = {
    GBKHexstrToString: GBKHexstrToString,
    oneByteIntToHex: oneByteIntToHex,
    binaryarrayToHexstr: binaryarrayToHexstr
}

Encode.js

/**
         * 标准的Javascript String转换成GBK二进制编码集合输出
         * 支持Array/String输入,异步
         */
        function stringToGbkHexstr (input) {
            var output = '';
            for (var offset = 0; offset < input.length; offset++) {
                var code = input.charCodeAt(offset) & 0xffff;
                if (code <= 0xFF) {
                    output += intToHex(code);
                } else {
                    output += GBKTable[code];
                }
            }
            return output;
		}
		
		/***
         * 将一个字节的整型转换成16进制
         *
         * @private
         * @param i
         * @returns {string}
         */
        function intToHex (i) {
            var output = '';
            for (; i != 0; i = i >> 8) {
                output = oneByteIntToHex(i & 0xff) + output;
            }
            return output.toUpperCase();
		}

		/***
         * 将一个字节的整型转换成16进制
         *
         * @private
         * @param i
         * @returns {string}
         */
        function oneByteIntToHex (i) {
            var output = '';
            i = parseInt(i);
            output += (i >> 4 & 0x0f).toString(16);
            output += (i & 0x0f).toString(16);
            return output.toUpperCase();
        };
		
		/**
		 * HexStr 转 ArrayBuffer
		 */
		function hexstrToArray (input) {
            if (input.length % 2 != 0) {
                throw new Error("not support length:" + input.length);
            }
            var output = new Array();
            var index = 0, offset = 0;
            for (; offset < input.length;) {
                var expected = input.substring(offset, offset + 1);
                var hi = (parseInt(expected, 16) & 0xff) << 4;
                offset++;
                expected = input.substring(offset, offset + 1);
                var lo = parseInt(expected, 16) & 0xff;
                output[index] = hi + lo;

                index++;
                offset++;
            }
            return output;
        }

		module.exports = {
			stringToGbkHexstr: stringToGbkHexstr,
			intToHex: intToHex,
			hexstrToArray: hexstrToArray
		}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微信小程序实现GBK和UTF-8互转 的相关文章

  • Spring Boot中整合WebSocket

    要在Spring Boot中整合WebSocket 需要进行以下步骤 1 创建一个Spring Boot项目 使用Spring Initializr创建一个新的Spring Boot项目 选择适当的Spring Boot版本和依赖项 添加W
  • 客户机操作系统已禁用 CPU。请关闭或重置虚拟机。

    VMware 安装CentOS7关机时提示 客户机操作系统已禁用 CPU 请关闭或重置虚拟机 之前一直使用的是CentOS6 5 关机的时候使用的halt命令 一直都可以正常关机 今天安装了CentOS7 使用halt命令关机的时候弹出了下
  • 通过Arduino ESP8266向闪存文件系统上传文件

    通过Arduino ESP8266向闪存文件系统上传文件 下载 Arduino ESP8266闪存文件插件程序 您有两种方法可以下载该插件程序 第一种方法是通过点击此链接进入 Arduino ESP8266官方GitHub页面下载 详情请见

随机推荐

  • Linux Vmlinux反汇编操作和 oops stack 回朔分析

    1 Linux Vmlinux反汇编操作和代码分析 1 1 对vmlinx反汇编 arm linux gnueabi objdump d vmlinux gt debug s 1 2 debug s代码段分析 vmlinux file fo
  • Android框架源码分析——以Arouter为例谈谈学习开源框架的最佳姿势

    得意于众多项目和第三方库的开源 开发中使用几行代码即可实现复杂的功能 但使用只是源码库的搬运工 源码中真正牛逼的技术并不属于我们 所以对源码和开源库的学习成了Android开发者提升技能的必经之路 笔者也曾经认真学习了常用开源框架的原理和实
  • ant-design-vue 图片预览组件,支持旋转,放大缩小,下载

    图片预览组件 支持旋转 放大缩小 下载 图片预览组件 支持旋转 放大缩小 下载 复制代码
  • 【华为OD机试真题 Python】快速开租建站(100%通过)

    前言 本专栏将持续更新互联网大厂机试真题 并进行详细的分析与解答 包含完整的代码实现 希望可以帮助到正在努力的你 关于大厂机试流程 面经 面试指导等 如有任何疑问 欢迎联系我 wechat steven moda email nansun0
  • Promise的九大方法(resolve、reject、then、catch、finally、all、allSettled、race、any)你都用过那些?

    前言 定期复盘 今天我们来复习一下 Promise 的几个方法 分别是 Promise resolve Promise reject Promise then Promise catch Promise finally Promise al
  • linux怎样切换成root用户

    输入命令 su root 即可 如果是使用vagrant的话 密码默认为vagrant
  • 基于stm32f407VGT6控制WS2812的TIM1+PWM+DMA实现方式

    项目中使用到了ws2812灯带 作为产品的外观显示灯 经过开发之后 整理一下 仅供大家参考 WS2812B是一个集控制电路与发光电路于一体的智能外控LED光源 其外型与一个5050 LED灯珠相同 每个元件即为一个像素点 像素点内部包含了智
  • 达梦数据库ODBC连接异常问题

    一 ODBC介绍 ODBC 即开放数据库连接Open Database Connectivity 是为解决 异构数据库间的数据共享而产生的一种数据库访问接口标准 ODBC 为异构数据库访问提供统一接口 允许应用程序以SQL 为数据存取标准
  • linux内核参数注释与优化

    linux内核参数注释与优化 目录 1 linux内核参数注释 2 两种修改内核参数方法 3 内核优化参数生产配置 参数解释由网络上收集整理 常用优化参数对比了网上多个实际应用进行表格化整理 使查看更直观 学习linux也有不少时间了 每次
  • 拓扑排序(最大食物链计数、图文结合)

    拓扑排序 拓扑排序 topological sort 是指由某个集合上的一个偏序得到该集合上的一个全序的操作 拓扑排序常用来确定一个依赖关系集中 事物发生的顺序 拓扑排序是对有向无环图的顶点的一种排序 它使得如果存在一条从顶点A到顶点B的路
  • Eclipse使用教程

    Eclipse使用教程 目录 1 Eclipse的基本概念 2 Eclipse创建Java文件 3 eclipse 代码提示功能 4 快捷键的使用 5 代码自动生成功能 6 代码注释 7 代码重构 重点 下载软件 Eclipse官方网站 点
  • 最近的一些感想

    我正在经历入行以来规模最小的一个项目 但是我却要使用很多的复杂技术 我已经为它实现了一个微型状态机 接下来我还要研究规则引擎 甚至可能还要自定义通讯协议 麻雀虽小 五脏俱全 沟通永远是最重要 最困难的事情 可是我永远也无法说服任何人 谁都有
  • 算法题记录2:跳格子问题

    题目 存在一个数组 0 1 2 3 1 2 3 其中包含的数字可能相同可能不同 跳格子规则 不同的相邻数字只能一个一个跳 而相同的数字可以无视数组中的距离 一步即达 问题 问从初始位置到数组末尾需要跳多少次 示例 0 1 2 3 4 5 6
  • [深入研究4G/5G/6G专题-35]: URLLC-6-《中国联通5G URLLC技术白皮书3.0版本》解读-2-无线侧关键技术

    目录 第3章 URLLC关键技术之无线接入网技术 3 1 无线接入网技术 3 1 1 低延时增强技术
  • 分部积分题型总结笔记(分部积分超强拓展)

    分部积分在考研中的重要性不用多说了 是很多题目解题的关键 我从李林880 张宇1000题 汤家凤1800中 对分部积分常考的六类题型进行了总结 见下 分部积分的作用 基础好的可跳过 分部积分的初始表达式如下 u v d x u v u v
  • Python项目打包, docker build构建docker镜像, Docker Compose (Docker编配)

    重点摘要 将本地Python项目打包构建docker镜像 并在docker中运行 流程1 8 8 Docker Compose Docker编配 附录 其他常用docker命令 1 首先 完成本地Python的开发 测试 2 1 将项目依赖
  • QT5.9.3中debug问题:DirectWrite: CreateFontFaceFromHDC() failed (Unknown error 0x88985000.) for QFontDef

    今天在迁移同时的代码的时候遇到如下问题 从QT4 8 6迁移到QT5 9 3 MSVC2015 32bit DirectWrite CreateFontFaceFromHDC failed Unknown error 0x88985000
  • SD卡小结

    最近应老板要求 用mega328P做了一个小板用来将串口接收的数据存在SD卡中 主要是保存长时间的一个其他板子的串口log而做的一个小板子 停停顿顿将近2周才做完 中间还做了其他的事情 当然主要原因是水平有限 以前没怎么接触过SD卡和FAT
  • R语言构造扑克牌自动发牌,洗牌

    在R语言构建自动洗牌 发牌 要求 自动洗牌 发牌 任务一 创建一副牌 学会如何使用R的数据类型和数据结构 任务二 编写发牌和洗牌的函数 学习从一个数据集中抽取想要的数值 首先需要创建一副牌 不包括大小王 从R语言的数据对象来看 数据框最合适
  • 微信小程序实现GBK和UTF-8互转

    js虽然有第三方支持的GBK工具 但是小程序没有 而我开发中又需要进行格式的转化 就依据前人的经验做了一份出来 分为两部分 Decode js和Encode js 分别是GBK格式的二进制文件转化为UTF 8的String和反转 impor