JavaScript字符串以UTF-16存储,跨编码转换需映射为字节序列;UTF-8用TextEncoder/TextDecoder,URL编码按场景选encodeURIComponent/encodeURI,Base64需预处理UTF-16,GBK等需encoding.js或iconv-lite。
javascript 中的 string 类型在内存中始终以 utf-16 编码存储,这是语言层面的底层约定。但实际开发中,字符串常需在不同编码格式间转换——比如发请求时转 utf-8 字节、传参时做 url 编码、处理旧系统数据时转 gbk、或传输二进制内容时用 base64。这些转换不是“改字符串本身”,而是把 utf-16 字符串按规则映射为字节序列,再重新解释为新格式。
UTF-8 ↔ 字符串:现代标准方案
浏览器和 Node.js(v11+)原生支持 TextEncoder 和 TextDecoder,专用于 UTF-8 与字节的互转,安全高效:
- 字符串 → UTF-8 字节数组:
new TextEncoder().encode('你好')返回Uint8Array(如[228, 184, 173, 229, 165, 189]) - UTF-8 字节数组 → 字符串:
new TextDecoder('utf-8').decode(uint8Array)自动处理 BOM 和非法字节(可加{ fatal: false }忽略错误)
注意:TextEncoder 只支持 UTF-8;若需 GBK、Shift_JIS 等,必须借助 encoding.js 或 Node.js 的 iconv-lite。
URL 编码:区分场景选对方法
三个常用函数本质不同,不能混用:
-
encodeURIComponent():编码单个参数值,中文、空格、“/”、“?”等全部转义,适合 query string 中的 value,如encodeURIComponent('搜索=前端')→%E6%90%9C%E7%B4%A2%3D%E5%89%8D%E7%AB%AF -
encodeURI():编码完整 URL,保留/ : ? #等结构字符,只转义语义外的字符,如encodeURI('https://a.com/路径?name=张')→https://a.com/%E8%B7%AF%E5%BE%84?name=%E5%BC%A0 -
escape():已废弃,对 Unicode 字符输出%uXXXX格式(如%u4F60),不兼容 UTF-8,不应再使用。
Base64 编解码:Unicode 字符需预处理
btoa() 和 atob() 仅接受 Latin-1(单字节)字符串,直接传中文会报错。正确做法是:
立即学习“Java免费学习笔记(深入)”;
- 编码(字符串 → Base64):
btoa(String.fromCharCode(...new TextEncoder().encode(str))) - 解码(Base64 → 字符串):
new TextDecoder().decode(Uint8Array.from(atob(base64), c => c.charCodeAt(0)))
老环境可用 encodeURIComponent + 正则替换模拟,但性能差且不适用于二进制数据。
多字节编码识别与转换:应对未知来源
读取本地文件、旧系统响应或用户上传文本时,原始编码常未知。需检测 + 转换两步:
- 检测编码:用
encoding.js的Encoding.detect(bytes)判断是 UTF-8、GBK 还是 Shift_JIS - 转换编码:
Encoding.convert(bytes, { from: 'gbk', to: 'UTF8' })或 Node.js 中iconv.decode(buffer, 'gbk')
这类操作无法用原生 API 完成,必须引入专用库。


















