javascript字符串默认utf-16存储,跨系统需转utf-8等编码;textencoder/textdecoder是标准方案,btoa/atob需配合utf-8字节处理,多字节编码靠encoding.js或iconv-lite检测转换,url编码用encodeuricomponent/encodeuri。

JavaScript 字符串默认以 UTF-16 存储,但实际传输、存储或对接外部系统(如文件、API、旧系统)时,常需转为 UTF-8、GBK、Shift_JIS、Base64 或 URL 编码等格式。处理不当就会乱码、截断或报错。核心思路是:先明确数据来源编码,再用合适方式转为目标编码,中间注意字节与字符串的边界。
用 TextEncoder / TextDecoder 处理 UTF-8 字节流
这是现代浏览器和 Node.js(v11+)推荐的标准方案,轻量、高效、无需第三方库。
- 字符串 → UTF-8 字节数组:new TextEncoder().encode("你好") 返回 Uint8Array,如 [228, 189, 160, 229, 165, 189]
- UTF-8 字节数组 → 字符串:new TextDecoder("utf-8").decode(uint8Array) 自动处理 BOM 和非法序列(可选 { fatal: false } 忽略错误字节)
- 注意:TextEncoder 只支持 UTF-8;若需 GBK、Big5 等,得借助 encoding.js 或 iconv-lite 等专用库
处理非 ASCII 字符的 Base64 编解码
btoa() 和 atob() 仅接受 Latin-1 字符(即单字节),直接传中文会报错。正确做法是先转 UTF-8 字节,再 Base64:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 编码(字符串 → Base64):btoa(String.fromCharCode(...new TextEncoder().encode(str)))
- 解码(Base64 → 字符串):new TextDecoder().decode(Uint8Array.from(atob(base64), c => c.charCodeAt(0)))
- 兼容老环境可用 encodeURIComponent + replace 组合,但性能略低,且不适用于二进制数据
识别并转换常见多字节编码(如 Shift_JIS、EUC-JP、GBK)
当读取本地文件、旧系统响应或用户上传的文本时,原始编码往往未知。这时需要检测 + 转换双步操作:
- 用 encoding.js 的 Encoding.detect(bytes) 判断来源编码(支持 UTF-8/SJIS/EUCJP/ISO-2022-JP 等)
- 再调用 Encoding.convert(bytes, { from: 'SJIS', to: 'UTF8' }) 转为目标编码
- Node.js 环境中也可用 iconv-lite(更成熟):iconv.decode(buffer, 'gbk') 直接得到字符串
URL 安全编码与解码(含中文、emoji)
encodeURI() 和 encodeURIComponent() 是标准方法,但要注意适用场景:
- encodeURIComponent 对整个字符串做 UTF-8 编码再百分号转义,适合 query 参数值,如 "搜索=前端开发" → "%E6%90%9C%E7%B4%A2=%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91"
- encodeURI 不编码 / ? : @ & = + $ # 等 URI 结构字符,适合编码完整 URL
- 解码统一用 decodeURIComponent,它能正确还原 UTF-8 字节序列










