Unicode 编码转换工具
文本与 Unicode 编码互转,支持多种格式输出
字符码点详情(点击复制)
什么是 Unicode?
Unicode(统一码)是计算机科学领域的一项业界标准,它对世界上大部分的文字系统进行了整理、编码。每个 Unicode 字符都有一个唯一的数字编号,称为码点(Code Point),通常用十六进制表示,加上 U+ 前缀,如 U+4E2D 表示汉字「中」。Unicode 编码转换工具可以将文本转换为各种 Unicode 表示格式,也可以将 Unicode 编码还原为文本。
如何使用
步骤
- 在输入框输入或粘贴要转换的文本
- 选择转换方向:文本转 Unicode 或 Unicode 转文本
- 选择输出格式:\uXXXX 或 U+XXXX(编码时可用)
- 结果自动生成,一键复制或交换输入输出
编码说明
- Unicode 转义格式对代码和调试有用,但可能降低普通文案的可读性。
- 解码时,请检查代理对和 Emoji 输出;拆分代理对可能导致乱码。
使用场景
技术原理
Unicode 标准(ISO/IEC 10646)为 17 个平面中的每个字符分配唯一的数值码点(U+0000 到 U+10FFFF)。基本多文种平面(BMP,平面 0)覆盖 U+0000-U+FFFF,包含几乎所有现代书写系统,包括 CJK 统一汉字。补充平面(1-16)存放历史文字、罕见 CJK、emoji 和特殊用途字符。本工具在可读文本与两种机器导向表示之间进行转换:JavaScript 风格的 \uXXXX 转义序列和标准 U+XXXX 记法。 UTF-16 是 JavaScript 字符串的内部编码——每个 BMP 字符存储为一个等于其码点的 16 位代码单元,而补充字符(U+10000 及以上)编码为代理对:从码点中减去 0x10000 得到 20 位值,然后拆分为 10 位高位代理(0xD800 + ((cp - 0x10000) >> 10))和 10 位低位代理(0xDC00 + ((cp - 0x10000) & 0x3FF))。工具的编码模式通过 String.prototype.codePointAt() 检测补充码点,并为 \uXXXX 格式生成正确的双 \u 转义。对于 U+XXXX 格式,直接显示完整码点。 解码模式解析三种语法:\uXXXX(四位十六进制,仅 BMP)、\u{XXXXX}(ES6 花括号语法,支持完整 Unicode 范围)和 U+XXXX(可变长度十六进制的标准记法)。正则表达式 /\\u\{([0-9a-fA-F]+)\}/g 处理花括号转义并传给 String.fromCodePoint(),而 /\\u([0-9a-fA-F]{4})/g 通过 String.fromCharCode() 处理传统转义。混合使用两者可在补充字符被编码为两个 \u 转义时正确重建代理对。 UTF-8 编码相关是因为它决定了字节长度:BMP 字符如「中」(U+4E2D)编码为 3 个 UTF-8 字节(E4 B8 AD),而 emoji 如「😀」(U+1F600)需要 4 个字节(F0 9F 98 80)。工具的字符计数器区分码点计数和 UTF-16 代码单元计数——当调试数据库、API 或表单字段中按代码单元而非字符计数的长度限制时,这一区分非常有用。
- 码点迭代:String.prototype.codePointAt(pos) 正确返回补充字符的完整码点,而 charCodeAt() 仅返回高位代理——工具使用展开运算符 [...str] 按码点迭代,内部调用字符串迭代器协议。
- 代理对数学:对于补充码点 CP > 0xFFFF,高位代理为 Math.floor((CP - 0x10000) / 0x400) + 0xD800,低位代理为 ((CP - 0x10000) % 0x400) + 0xDC00——编码模式应用此公式生成有效的 \uD800\uDC00 代理对。
- 解码正则管道:三种模式按顺序执行——\u{XXXXX}(ES6 花括号)→ \uXXXX(四位十六进制)→ U+XXXX(标准记法)——fromCodePoint() 处理花括号和 U+ 路径,fromCharCode() 处理传统四位路径。
- UTF-8 字节结构:BMP 字符使用 1-3 个 UTF-8 字节(ASCII = 1 字节,拉丁补充 = 2 字节,CJK = 3 字节);补充字符使用 4 字节,遵循 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 模式——工具的字节计数器使用 new Blob([str]).size 进行精确测量。
- 码点与代码单元:单个可见字符可能占用多个码点(如 é 可以是 U+00E9 或 U+0065 + U+0301 组合尖音符)——工具同时报告 charCount(UTF-16 代码单元)和 codepointCount(Unicode 标量值)以揭示这一差异。
- Unicode 平面概览:平面 0(BMP)= 现代文字,平面 1(SMP)= 历史文字 + emoji + 数学符号,平面 2(SIP)= 罕见 CJK,平面 14(SSP)= 标签 + 变体选择符,平面 15-16 = 私用区——编码模式通过 codePointAt() 正确处理所有平面。
- \u 与 U+ 记法:\uXXXX 是 JavaScript/Java/C 的转义序列(无花括号时仅限 BMP);U+XXXX 是 Unicode 联盟的标准记法(至少 4 位十六进制,无上限)——工具的格式切换在这两种表示之间转换。
示例
中文转 Unicode 转义
输入: 你好世界(4 个 CJK 字符,12 个 UTF-8 字节)
输出: \u4f60\u597d\u4e16\u754c
说明: 仅适用于 BMP 码点;常用于 JSON 字符串、JavaScript 字面量和日志文件Emoji 转代理对转义
输入: 😀🎉(2 个 emoji,码点均高于 U+FFFF)
输出: \uD83D\uDE00\uD83C\uDF89
说明: 非 BMP 字符以 UTF-16 代理对的形式编码;老版本 JS 引擎需要用 String.fromCodePoint 才能正确还原解码 Unicode 转义
输入: \u4e2d\u6587\u6d4b\u8bd5
输出: 中文测试
说明: 把转义字符串粘贴进来,工具会反向解码;调试 CJK 数据时建议核对输出字节是否与原始数据一致常见问题
这个工具会显示每个字符的哪些信息?
码点(十进制和十六进制)、所属区块(如 Basic Latin、CJK Unified Ideographs)、类别(字母、数字、符号、标点等)、Unicode 名称,以及 UTF-8 / UTF-16 / UTF-32 字节表示。便于排查编码 bug 或挑选合适的字符。
UTF-8、UTF-16 和 UTF-32 有什么区别?
三者编码的都是同一套 Unicode 字符。UTF-8 每个码点用 1-4 字节,并向下兼容 ASCII(是网络上的主流编码)。UTF-16 用 2 或 4 字节(JavaScript 和 Windows 内部使用)。UTF-32 始终用 4 字节(在传输中很少见,但常用于内存表示)。
为什么「𝓗」会显示为两个 UTF-16 编码单元?
码点高于 U+FFFF(基本多文种平面)的字符在 UTF-16 中会编码成「代理对」:两个 16 位单元。JavaScript 的 string.length 把它算作 2,而 Array.from(str) 会把它当成 1 个。页面会同时展示两种视角,方便你排查长度计算上的意外。
什么是规范化形式(NFC/NFD/NFKC/NFKD)?
Unicode 允许同一可见文本有多种表示——「é」可以是单个码点(U+00E9),也可以是 e + 组合用尖音符(U+0065 U+0301)。NFC 把它们合成,NFD 拆分;NFKC/NFKD 还会额外折叠兼容字符(½ → 1/2)。在做字符串比较或哈希前务必先规范化。
为什么 emoji 有时会显示为方框?
因为你浏览器使用的字体没有该字形。现代 emoji 使用 ZWJ 序列(例如 👨👩👧 = 男人 + ZWJ + 女人 + ZWJ + 女孩),需要特定字体才能合成单个图像;旧字体会显示为三个独立 emoji 或方框。
如何按名称查找字符?
在搜索框中输入名称(或部分名称)。名称遵循官方 Unicode 名称表(LATIN SMALL LETTER A、GREEK CAPITAL LETTER OMEGA、MUSICAL SYMBOL G CLEF)。常见 emoji 还有页面也能识别的「CLDR 简称」。
我输入的内容会被上传吗?
不会。查询使用的是浏览器内置的 Unicode 数据库,不会上传任何内容。