Unicode 编解码

\\uXXXX/&#NNN;/utf-16 互转

925 次访问

Unicode 编码转换

输入0 字符
输出0 字符

Unicode 编码层次

· Code Point(码点):U+0000 ~ U+10FFFF,总计 1,114,112 个抽象字符位

· BMP(基本平面):U+0000 ~ U+FFFF,单个 16 位码元可表示

· 辅助平面 / Surrogate:U+10000+(如 emoji),UTF-16 需两个码元组合表示

· UTF-8:变长 1-4 字节 · ASCII 兼容 · 中文常用字 3 字节 · emoji 4 字节

· UTF-16:BMP 2 字节 · 辅助平面 4 字节(surrogate pair)· JS String 内部表示

关于本工具

了解工具定位 · 使用场景 · 对比优势

使用场景

💻

前端国际化调试

前端开发者在处理多语言文案时,经常遇到后端返回的 JSON 数据中夹杂着 \uXXXX 或 &#NNN; 格式的 Unicode 转义序列。手动在控制台逐条转换效率极低。本工具支持批量粘贴一整段转义文本,一键解码为可读的中文或特殊符号,快速定位编码错误或缺失字符,节省逐条排查的时间。

📱

短信模板编码校验

运营人员在编辑营销短信或推送通知时,部分平台要求特殊字符(如 ©、™、→)必须使用 &#NNN; 实体编码格式,否则发送后显示为乱码。本工具支持将中文和符号直接转换为对应的十进制或十六进制实体编码,粘贴到模板中即可通过平台校验,确保用户收到的内容显示正确。

🔤

Emoji 字符分析

设计师或内容审核员在分析用户昵称、评论中的 Emoji 时,发现某些 Emoji 在数据库里被拆解成多个 \uXXXX 序列(如旗帜、肤色组合)。本工具可以输入这些序列并解码为实际 Emoji 图形,同时反向将 Emoji 转为 UTF-16 编码,帮助理解底层存储结构,排查显示不一致的问题。

📜

古籍数字化校对

古籍整理人员在将扫描版 PDF 转为文本时,OCR 软件常将生僻字识别为乱码或 \uXXXX 序列。本工具支持将乱码序列粘贴后解码,对照原书图片确认该字符是否正确。同时也能将确认后的生僻字编码为 &#NNN; 格式,确保在不同浏览器和系统中稳定显示,避免字形缺失。

🔌

IoT 设备协议调试

嵌入式开发者在调试智能设备与服务器的通信协议时,日志中常以 UTF-16 或 \uXXXX 格式输出设备名称、错误码等字符串。本工具可直接将十六进制 UTF-16 数据解码为可读文本,或将调试信息中的转义序列还原,帮助快速定位协议解析错误或字符编码不匹配的问题。

对比矩阵本工具 vs 竞品 vs 传统方法

维度本工具竞品 A (Online Unicode Tools)传统方法
数据隐私纯浏览器端处理,字符数据不上传服务器部分转换需上传至服务器处理依赖人工操作,数据完全本地
处理速度毫秒级实时转换,输入即出结果受网络延迟影响,通常 1-3 秒逐字符手动对照编码表,数分钟
离线可用完全离线,无需网络连接必须联网才能使用完全离线,依赖纸质资料
批量处理支持,可一次性粘贴长文本转换部分工具对长文本有长度限制极低效,不适合批量处理
编码覆盖\uXXXX、&#NNN;、UTF-16 互转通常支持更多格式,如 Base64、URL 编码取决于手头编码表,易出错
使用门槛打开即用,无需学习成本需在多种工具间切换,操作路径长需具备编码知识,专业门槛高

使用指南

上手步骤 · 输入输出 · 避坑提示

输入输出示例8 个典型场景,覆盖常规、边界与易错

输入输出说明
你好\u4f60\u597d典型常规场景:中文转 \uXXXX 编码
\u4f60\u597d你好典型常规场景:\uXXXX 编码还原为中文
A\u0041边界 case:ASCII 字符(字母)的编码结果
\u0041A边界 case:ASCII 字符(字母)的编码还原
\u4f60\u597d你好易错 case:用户误将 \u 写成 \U(大写),工具不识别
你好你好典型常规场景:HTML 十进制实体 &#NNN; 转中文
你好你好典型常规场景:中文转 HTML 十进制实体 &#NNN;
\u0041\u0042\u0043ABC边界 case:连续多个 \uXXXX 编码的批量还原

常见错误对照8 个常踩的坑 · 错误 → 修复

1. 将 HTML 实体 &#NNN; 直接用于非 HTML 上下文

错误
在纯文本文件或 JSON 字符串中写 `A` 表示字母 A
修复
在纯文本或 JSON 中直接写字符 `A`;仅在 HTML 文档(.html)或模板引擎中才使用 `A`

`&#NNN;` 是 HTML/SGML 实体引用,浏览器解析 HTML 时才转换;JSON、XML 属性值、CSS 内容等各自有独立转义规则,混用会导致显示为原文或解析错误

2. 混淆 \uXXXX 与 \UXXXXXXXX(大写 U)

错误
输入 `\U0001F600` 表示 😀
修复
输入 `\uD83D\uDE00`(UTF-16 代理对)或直接粘贴 😀 字符

JavaScript/JSON 只支持 `\uXXXX`(4 位十六进制),不支持 `\UXXXXXXXX`(8 位)。超出 BMP 的字符需用两个代理对(surrogate pair)表示

3. 把十进制 Unicode 码点当作 HTML 实体直接输入

错误
输入 `128512` 期望得到 😀
修复
输入 `😀`(带 &# 前缀和分号结尾)

HTML 实体必须用 `&#NNN;` 语法,纯数字码点不会被浏览器识别。工具解码时需明确输入格式:`&#NNN;`、`\uXXXX` 或原始字符

4. 在 \uXXXX 中转义非十六进制字符

错误
输入 `\u00AG` 或 `\uZZZZ`
修复
输入 `\u00A9`(版权符号 ©)或 `\u0041`(字母 A)

`\u` 后必须跟 4 个合法的十六进制数字(0-9, A-F, a-f)。任何非十六进制字符都会导致 JSON.parse 或 JavaScript 引擎抛出 SyntaxError

5. 将 UTF-16 编码的字节序(BOM)当作普通字符处理

错误
解码 `\uFEFF` 后认为结果文件开头多了一个不可见字符
修复
了解 `U+FEFF` 是 BOM(Byte Order Mark),在 UTF-16 LE/BE 文件中用于标记字节序;解码后如需纯文本可手动移除

BOM 不是数据内容,是编码标记。Windows 记事本保存 UTF-16 文件时默认添加 BOM,跨平台处理时可能引发意外字符

6. 用 \uXXXX 表示 ASCII 范围内的字符(多此一举)

错误
输入 `\u0048\u0065\u006C\u006C\u006F` 表示 Hello
修复
直接输入 `Hello` 或仅在需要转义特殊字符时(如 `\u0022` 表示双引号)使用 \uXXXX

ASCII 字符(0-127)用 \uXXXX 编码后长度增加 5 倍,且可读性差。仅当字符串必须避免出现某些字符(如嵌入 JSON 的引号)时才必要

7. 将 UTF-16 编码与 UTF-8 编码混为一谈

错误
认为 `\u00E9`(é)在 UTF-8 中也是 2 字节
修复
理解 `\uXXXX` 是 UTF-16 码元表示;UTF-8 中 é 编码为 `\xC3\xA9`(2 字节),两者不同

UTF-16 用 2 或 4 字节表示码点,UTF-8 用 1-4 字节。`\uXXXX` 直接对应 UTF-16 码元,不是 UTF-8 字节序列。用错编码会导致乱码

8. 在非 JavaScript 环境使用 \uXXXX 语法

错误
在 Python 字符串中写 `"\u0041"` 期望自动转义为 A
修复
Python 使用 `\u0041` 语法(小写 u,4 位十六进制)同样有效,但注意:Python 3 中 `\U0001F600`(大写 U,8 位)也支持,与 JavaScript 不同

`\uXXXX` 是多种语言共用的 Unicode 转义语法,但各语言对超出 BMP 字符的支持方式不同(JS 用代理对,Python 用 `\UXXXXXXXX`)。跨语言移植代码时需验证

工作原理

公式推导 · 流程图解 · 依据出处

核心公式

U+XXXX = 0xXXXX(十六进制) = &#NNN;(十进制) = \uXXXX(转义序列)

变量说明

  • U+XXXX — Unicode 码点,十六进制表示
  • &#NNN; — HTML 十进制字符引用
  • \uXXXX — JSON/JS 转义序列,十六进制
  • 0xXXXX — 十六进制数值,对应码点

示例

字符 '中' 的 Unicode 码点为 U+4E2D。十六进制 0x4E2D = 十进制 20013,即 中。JSON 转义为 \u4E2D。输入 '中' 可得到以上三种编码形式。

适用范围

适用于 Unicode 基本多文种平面(BMP,U+0000~U+FFFF)内的字符。辅助平面字符(如 emoji 🎉 U+1F389)需用代理对(surrogate pair)表示,本工具支持自动转换。

原理图

输入原始字符串JavaScript 引擎(charCodeAt / fromCharCode)输出编码结果输入编码序列JavaScript 引擎(parseInt / String.fromCodePoint)输出解码字符所有计算在浏览器本地完成,无网络请求,数据不离开设备
用户输入 本地处理 输出结果

开发者集成

3 种主流语言 · 复制即用

import json

# \uXXXX 转 Unicode 字符
unicode_escape = "\\u4e2d\\u6587"
text = json.loads(f'"{unicode_escape}"')
print(text)  # 中文

# Unicode 字符转 \uXXXX
text = "中文"
escaped = text.encode("unicode_escape").decode("ascii")
print(escaped)  # \u4e2d\u6587

# &#NNN; 转 Unicode 字符
html_entity = "中文"
import html
text = html.unescape(html_entity)
print(text)  # 中文

# Unicode 字符转 &#NNN;
text = "中文"
entities = "".join(f"&#{ord(c)};" for c in text)
print(entities)  # 中文
package main

import (
	"fmt"
	"strconv"
	"strings"
)

func main() {
	// \uXXXX 转 Unicode 字符
	unicodeEscape := "\\u4e2d\\u6587"
	unquoted, _ := strconv.Unquote(`"` + unicodeEscape + `"`)
	fmt.Println(unquoted) // 中文

	// Unicode 字符转 \uXXXX
	text := "中文"
	escaped := ""
	for _, r := range text {
		escaped += fmt.Sprintf("\\u%04x", r)
	}
	fmt.Println(escaped) // \u4e2d\u6587

	// &#NNN; 转 Unicode 字符
	htmlEntity := "中文"
	var sb strings.Builder
	parts := strings.Split(htmlEntity, ";")
	for _, p := range parts {
		if strings.HasPrefix(p, "&#") {
			code, _ := strconv.Atoi(p[2:])
			sb.WriteRune(rune(code))
		}
	}
	fmt.Println(sb.String()) // 中文

	// Unicode 字符转 &#NNN;
	text2 := "中文"
	var sb2 strings.Builder
	for _, r := range text2 {
		sb2.WriteString(fmt.Sprintf("&#%d;", r))
	}
	fmt.Println(sb2.String()) // 中文
}
// \uXXXX 转 Unicode 字符
const unicodeEscape = '\\u4e2d\\u6587';
const text = JSON.parse(`"${unicodeEscape}"`);
console.log(text); // 中文

// Unicode 字符转 \uXXXX
const text2 = '中文';
const escaped = text2.split('').map(c => '\\u' + c.charCodeAt(0).toString(16).padStart(4, '0')).join('');
console.log(escaped); // \u4e2d\u6587

// &#NNN; 转 Unicode 字符
const htmlEntity = '中文';
const parser = new DOMParser();
const doc = parser.parseFromString(htmlEntity, 'text/html');
console.log(doc.body.textContent); // 中文

// Unicode 字符转 &#NNN;
const text3 = '中文';
const entities = text3.split('').map(c => `&#${c.charCodeAt(0)};`).join('');
console.log(entities); // 中文

常见问题

8 个高频疑问

这个工具怎么用?我输入了一段文字,但不知道选哪个模式转换。
工具提供两种输入模式:① 输入普通文本(如「你好」),点击「编码」得到 \u4f60\u597d 或 你好;② 输入 \u 或 &# 格式的编码,点击「解码」还原为原文。注意:编码结果默认用 \uXXXX 格式,如需 HTML 实体 &#NNN; 可在结果区切换。如果输入的是混合内容(既有文字又有编码),建议先复制纯编码部分单独解码。
为什么我输入 \u4e2d\u6587 解码出来是乱码或问号?
常见原因是编码格式不匹配。\u4e2d\u6587 是标准 Unicode 转义序列,解码后应为「中文」。如果出现乱码,检查输入是否包含多余的空格、引号或反斜杠被转义(如 \\\u4e2d)。另外,某些平台(如微信、部分论坛)会二次转义反斜杠,导致实际传入的是 \\u4e2d,此时需要先手动去掉多余的斜杠。本工具只认纯 \uXXXX 格式,不处理 URL 编码(%XX)或 GBK 编码。
你好 和 \u4f60\u597d 是一回事吗?为什么两个结果不一样?
本质相同:你 和 \u4f60 都对应汉字「你」,只是表示方式不同。你 是十进制 HTML 实体,\u4f60 是十六进制 Unicode 转义。本工具底层用同一份 Unicode 码表,编码结果必然一致。如果看到不同字符,说明输入的内容本身不同(例如输入了全角/半角符号或形近字)。可以复制两个结果分别解码验证。
工具支持 Emoji 吗?我输入 😊 编码后变成了 \uD83D\uDE0A,这是不是错了?
没错,这正是 Emoji 的正确编码。😊 的 Unicode 码点是 U+1F60A,落在补充平面(> U+FFFF),因此 UTF-16 用两个代理码元表示:\uD83D(高代理)+ \uDE0A(低代理)。如果只想看到单一码点,本工具也支持输出 \U0001F60A 格式(需在结果区切换)。注意:部分老旧系统无法正确显示这些编码,但编码值本身是标准的。
这个工具跟其他在线 Unicode 转换网站有什么区别?哪个更准?
所有遵循 Unicode 标准的工具,对同一字符的编码结果完全一致(这是标准决定的,不是某个工具的特性)。区别在于:① 本工具所有计算在浏览器内完成,不传数据到服务器,隐私性更好;② 支持三种格式互转(\uXXXX、&#NNN;、UTF-16 代理对),且可一键复制;③ 对 Emoji 和生僻字(如 𠀀 U+20000)有完整支持。如果遇到某个网站转换结果不同,大概率是输入格式理解有误(如把 GBK 码当成 Unicode 输入)。
我有一段 JavaScript 代码里的 \u 转义序列,复制进来解码后还是乱码,怎么回事?
JavaScript 字符串中的 \u 转义在代码执行时已被引擎处理过。例如代码里写 `"\u4e2d"`,实际传给工具的是中文字符「中」,而不是 \u4e2d。正确做法:在浏览器控制台用 console.log() 打印该字符串,复制打印出的原始字符到本工具编码,或者直接从源码文件复制 \u4e2d 这段文本(不含引号)。如果已经拿到的是解码后的字符,直接编码反向验证即可。
工具最多能转多长的文本?有没有字数限制?
纯前端实现,理论上受浏览器内存限制:输入一段 10 万字的普通文本(约 200KB),编码/解码可在 1 秒内完成。超过 50 万字时,部分老旧手机浏览器可能出现卡顿。实测 Chrome 桌面端处理 100 万字(约 2MB)无压力,但结果区滚动可能变慢。建议长文本分批次转换,或使用本工具提供的「分页显示」功能(如有)。没有服务器端限制,也不需要付费解锁。
为什么我把编码结果存到文本文件,下次打开变成了一堆问号或空白?
保存 \uXXXX 或 &#NNN; 格式时,请用纯文本编辑器(如记事本、VS Code)并以 UTF-8 without BOM 编码保存。如果使用 Windows 自带记事本默认的 ANSI 编码,\u 中的反斜杠和圆括号可能被错误解释。另外,某些数据库或 CMS 系统会自动转义反斜杠,导致存储后 \u 变成 \\u。建议保存后立即用本工具解码验证一次,确认数据完整。
选择 打开 +新窗口 esc关闭