网页 JavaScript 如何编码 gb2312

分类:JavaScript     发布时间:2023-09-07     最后更新:2023-09-07     浏览数:741
昨天学习打印机指令时,遇到中文乱码的问题。

解决方案

先说解决方案:

import { encodingIndexes } from "@zxing/text-encoding/es2015/encoding-indexes";
import { TextEncoder } from "@zxing/text-encoding";
// @ts-ignore
window.TextEncodingIndexes = { encodingIndexes: encodingIndexes }; 

// 如果没有引入 encodingIndexes,机会报错:Indexes missing. Did you forget to include encoding-indexes.js first?
// 当然,我这里是比较粗暴的做法,可能有更好的引入 encodingIndexes 的方法

const encoder = new TextEncoder("gb2312", {
    NONSTANDARD_allowLegacyEncoding: true,
});
const encoded = encoder.encode("中文");
console.log(encoded); // Uint8Array(2) [214, 208, buffer: ArrayBuffer(2), byteLength: 2, byteOffset: 0, length: 2, Symbol(Symbol.toStringTag): 'Uint8Array']

转为 16 进制为 D6 D0,查看 GB2312 编码表为 D6D0 中

问题

打印英文不存乱码的问题。 打印机支持 gb2312 编码,从浏览发送数据到打印机,需要编码为 gb2312,如果发送到打印的字节数组是用 TextEncoder 的 encode("中") 编码出来,打印机打出的是 “涓 ”。

const encoder = new TextEncoder();
const encoded = encoder.encode(“中”);
console.log(encoded); // Uint8Array(3) [228, 184, 173, buffer: ArrayBuffer(3), byteLength: 3, byteOffset: 0, length: 3, Symbol(Symbol.toStringTag): 'Uint8Array']

[228, 184, 173] 转为 十六进制 E4 B8 AD,查 GB2312 编码表 E4 B8 -> 涓,AD 没有编码。

乱码的原因是:打印机支持 gb2312,但是接收到的却是 utf-8 编码的文字,所以就乱码了。

解决方法:统一两端的编码。

参考

https://developer.mozilla.org/zh-CN/docs/Web/API/TextEncoder

https://juejin.cn/post/6844903534144552967

https://github.com/zxing-js/text-encoding

GB2312 编码表

上一篇: 基于 fabric.js 实现一个简单的标签编辑器 下一篇: Fabric.js 实现表格 table