gb2312
一款符合 GB2312-80 国家标准(《信息交换用汉字编码字符集·基本集》)的生产级编码/解码库,支持 ESM、CommonJS(CJS)和 IIFE 三种格式,可无缝运行于 Node.js 和浏览器环境。
核心特性
- 多格式支持:适配 Node.js(ESM/CJS)和浏览器(IIFE,暴露全局变量
gb2312);
- 零依赖:预构建 GB2312-Unicode 映射表,无需运行时拉取数据;
- 类型安全:完整 TypeScript 支持,提供详细的类型定义;
- 健壮可靠:自定义错误处理、无效字符替换机制,支持严格模式;
- 全量覆盖:支持 GB2312-80 标准定义的全部 ~7445 个字符(含汉字、符号、ASCII 字符)。
安装
通过 npm(或 yarn/pnpm)安装:
npm install gb2312 --save
使用示例
1. ESM 格式(现代 Node.js/构建工具如 Vite/Rollup)
import { encode, decode, has, Gb2312Error } from 'gb2312';
try {
const gb2312Buffer = encode('中华人民共和国', { strict: true });
console.log(gb2312Buffer);
} catch (err) {
if (err instanceof Gb2312Error) {
console.error('编码失败:', err.message);
}
}
const decodedStr = decode(Buffer.from([0xD6, 0xD0, 0xBB, 0xAA]));
console.log(decodedStr);
console.log(has('中'));
console.log(has('𠀤'));
2. CommonJS 格式(传统 Node.js)
const { encode, decode } = require('gb2312');
const buffer = encode('测试GB2312编码');
const str = decode(buffer);
console.log(str);
3. 浏览器环境(IIFE 格式)
通过 <script> 标签引入(自动暴露全局变量 gb2312):
<script src="https://unpkg.com/gb2312@1.0.0/dist/gb2312.iife.js"></script>
<script>
try {
const buffer = gb2312.encode('浏览器中使用GB2312');
const str = gb2312.decode(buffer);
console.log(str);
console.log(gb2312.has('浏'));
} catch (err) {
if (err instanceof gb2312.Gb2312Error) {
alert('错误:' + err.message);
}
}
</script>
API 文档
核心编码/解码方法
encode(str: string, options?: ConvertOptions): Buffer | Uint8Array
将 Unicode 字符串编码为 GB2312 格式的二进制数据(Node.js 中返回 Buffer,浏览器中返回 Uint8Array)。
str | string | 待编码的 Unicode 字符串。 |
options | ConvertOptions | 可选配置: - replacement:无效字符的替换符(默认:?) - strict:无效字符是否抛错(默认:false) |
示例:
const buffer = encode('中文测试', { replacement: '□' });
decode(buffer: Buffer | Uint8Array, options?: ConvertOptions): string
将 GB2312 格式的二进制数据解码为 Unicode 字符串。
buffer | Buffer/Uint8Array | 待解码的 GB2312 二进制数据。 |
options | ConvertOptions | 同 encode 的配置项。 |
示例:
const str = decode(Buffer.from([0xD6, 0xD0, 0xCE, 0xC4]), { strict: true });
console.log(str);
映射查询方法
toUnicode(code: Gb2312Code): UnicodeCode | null
将 16 位 GB2312 编码(如 “中” 的编码 0xD6D0)转换为对应的 Unicode 编码。
fromUnicode(code: UnicodeCode): Gb2312Code | null
将 Unicode 编码(如 “中” 的编码 20013)转换为对应的 16 位 GB2312 编码。
has(char: string): boolean
检查单个字符是否在 GB2312 字符集中(仅支持长度为 1 的字符串)。
getInfo(char: string): Gb2312Mapping | null
获取字符的详细编码信息(若字符不在 GB2312 中,返回 null)。
返回类型 Gb2312Mapping 结构:
interface Gb2312Mapping {
gb2312: Gb2312Code;
high: Gb2312Byte;
low: Gb2312Byte;
unicode: UnicodeCode;
char: string;
}
示例:
const info = getInfo('中');
console.log(info);
工具方法
splitCode(code: Gb2312Code): { high: Gb2312Byte; low: Gb2312Byte }
将 16 位 GB2312 编码拆分为高位字节和低位字节。
combineBytes(high: Gb2312Byte, low: Gb2312Byte): Gb2312Code
将高位字节和低位字节合并为 16 位 GB2312 编码(无效字节会抛出 Gb2312Error)。
isReady(): boolean
检查库的映射表是否初始化完成(适用于异步环境)。
getInfoSummary(): { totalCount: number; firstChar: string; lastChar: string; version: string }
获取 GB2312 字符集的汇总信息(如总字符数、首个/最后一个字符)。
类型定义
所有类型均已导出,TypeScript 用户可直接使用:
type Gb2312Code = number;
type Gb2312Byte = number;
type UnicodeCode = number;
interface ConvertOptions {
replacement?: string;
strict?: boolean;
}
class Gb2312Error extends Error {}
错误处理
通过导出的 Gb2312Error 类捕获库专属错误,避免与其他错误混淆:
import { encode, Gb2312Error } from 'gb2312';
try {
encode('𠀤', { strict: true });
} catch (err) {
if (err instanceof Gb2312Error) {
console.error('GB2312 错误:', err.message);
}
}
兼容性说明
| Node.js | ✅ ESM (v14+) / CJS (v12+) | 二进制数据使用 Buffer。 |
| 浏览器 | ✅ IIFE(所有现代浏览器) | 二进制数据使用 Uint8Array。 |
| TypeScript | ✅ 完整支持 | 内置 .d.ts 类型定义文件。 |
| 构建工具(Vite/Rollup) | ✅ ESM/CJS 自动适配 | 通过 package.json 自动识别格式。 |
许可证
MIT 许可证