当前位置: 首页 > news >正文

uniapp -- 小程序处理与设备通讯 GBK/GB2312 编码问题。

🌐 小程序/UniApp 中处理 GBK 编码:iconv-lite + Buffer 实用指南

适用场景:设备通信、蓝牙传输、旧系统对接、十六进制转中文等涉及 GB2312/GBK 编码 的中文乱码问题。


🧩 一、为什么需要这个工具?

在小程序或 UniApp 开发中,常遇到以下问题:

  • 蓝牙设备返回的中文是 GBK 编码的字节数组;
  • 后台接口返回十六进制字符串,需转为中文;
  • TextDecoder 不支持 gbk(低版本基础库);
  • 直接 toString() 出现乱码 ❌。

✅ 解决方案:使用 iconv-lite + Buffer 实现 GBK ↔ UTF-8 安全互转。


✅ 二、核心依赖

npm install iconv-lite buffer

⚠️ 注意:小程序需在 app.json 中配置 “usingComponents”: false 或确保兼容性。

🔧 三、核心代码:GBKDecoder 工具类

import * as iconv from 'iconv-lite';
import { Buffer } from 'buffer';// 预加载编码(提升性能)
iconv.encodingExists('gbk');export class GBKDecoder {/*** 统一转换为 Buffer*/private static toBuffer(data: any): Buffer {if (!data) return Buffer.alloc(0);if (Buffer.isBuffer(data)) return data;if (data instanceof Uint8Array) return Buffer.from(data);if (Array.isArray(data)) return Buffer.from(data);if (typeof data === 'object' && Array.isArray(data.data)) return Buffer.from(data.data);return Buffer.from(String(data));}/*** 解码 GBK 数据为字符串*/static decode(data: Buffer | Uint8Array | number[] | any): string {if (typeof data === 'string') return data;if (!data) return '';try {const buffer = this.toBuffer(data);if (buffer.length === 0) return '';return iconv.decode(buffer, 'gbk').toString();} catch (error) {console.warn('[GBKDecoder.decode] 解码失败:', error);return String(data);}}/*** 编码字符串为 GBK Buffer*/static encode(str: string): Buffer {if (typeof str !== 'string') str = String(str);try {return iconv.encode(str, 'gbk');} catch (error) {console.warn('[GBKDecoder.encode] 编码失败:', error);return Buffer.from(str, 'utf8');}}/*** 批量解码对象中的字段*/static decodeFields<T extends Record<string, any>>(obj: T,gbkFields: (keyof T)[]): T {const result = { ...obj };for (const field of gbkFields) {const value = result[field];if (value !== undefined && value !== null) {result[field] = this.decode(value);}}return result;}/*** 检测是否可能是 GBK 编码(含中文)*/static isLikelyGBK(data: any): boolean {try {const buffer = this.toBuffer(data);if (buffer.length === 0) return false;const decoded = iconv.decode(buffer, 'gbk');return /[\u4e00-\u9fa5]/.test(decoded);} catch {return false;}}/*** 智能解码:优先 UTF-8,失败尝试 GBK*/static smartDecode(data: any): string {if (typeof data === 'string') return data;try {const buffer = this.toBuffer(data);if (buffer.length === 0) return '';// 尝试 UTF-8const utf8 = buffer.toString('utf8');if (utf8 === decodeURIComponent(escape(utf8))) {return utf8; // 有效 UTF-8}// 尝试 GBKreturn this.decode(buffer);} catch {return String(data);}}
}

🚀 四、使用示例

1:十六进制字符串 → 中文

function hexToBytes(hex) {const bytes = []for (let i = 0; i < hex.length; i += 2) {bytes.push(parseInt(hex.substr(i, 2), 16))}return bytes
}const hex = 'C4E3BAC3'; // "你好"
const hex1 = 'BCA6CDC8' // "鸡腿"
const bytes = hexToBytes(hex);
const text = GBKDecoder.decode(bytes);
console.log(text); // 输出:你好

2:中文 → 十六进制


const buffer = GBKDecoder.encode('你好');
const hex = Array.from(buffer, b => b.toString(16).padStart(2, '0')).join('').toUpperCase();
console.log(hex); // 输出:C4E3BAC3

3:批量解码 API 返回字段

  // "你" 的 GBK 是 [196, 227] → C4 E3// "好" 的 GBK 是 [186, 195] → BA C3const res = { name: [196, 227], desc: [186, 195] }const decoded = GBKDecoder.decodeFields(res, ['name', 'desc'])console.log(decoded, 3333) // { name: '你', desc: '好' }

4:智能解码(自动判断编码)

const data = new Uint8Array([196, 227, 186, 195])
const text = GBKDecoder.smartDecode(data);
console.log(text); // 输出:你好
http://www.dtcms.com/a/327843.html

相关文章:

  • 记一次 .NET 某汽车控制焊接软件 卡死分析
  • 腾讯云terraform学习教程
  • 传输线的效应
  • 【MAUI】在 .NET MAUI 中实现全局异常捕获的完整指南
  • 五、Nginx、RabbitMQ和Redis在Linux中的安装和部署
  • DAY41 简单CNN
  • PostgreSQL——数据查询
  • PyCharm Community 2024.2.3.exe 安装教程(详细步骤,附安装包下载)
  • Docker守护进程安全加固在香港VPS环境的操作标准
  • vue3使用插槽写一个自定义瀑布列表
  • 海康视觉相机驱动软件参数配置
  • 用 Docker 安装并启动 MySQL:从零到实战的完整指南
  • vivo Pulsar 万亿级消息处理实践(2)-从0到1建设 Pulsar 指标监控链路
  • 人工智能与金融:金融行业的革新
  • 计算机网络摘星题库800题笔记 第3章 数据链路层
  • linux Phy驱动开发之mido总线介绍
  • 打印流水号标签
  • 三防手机和防爆手机的本质区别是什么?
  • INSAR数据处理---ENVI5.6(Sarscape)
  • 【从零开始java学习|第三篇】变量与数据类型的关联
  • 秋招笔记-8.9
  • 【网络运维】Linux和自动化: Ansible基础实践
  • SynAdapt:通过合成连续思维链实现大语言模型的自适应推理
  • 机器学习第十课之TF-IDF算法(红楼梦文本分析)
  • 服务器节点技术解析:从架构原理到家庭实践的全维度指南
  • 文件IO函数实现
  • 异或和查询
  • 【报错处理】mount: /boot/efi: unknown filesystem type ‘LVM2_member‘.
  • ARM基础概念 异常处理01 day52
  • 前端项目一键换肤