ToolAct工具行动

Unicode 编码转换工具

文本与 Unicode 编码互转,支持多种格式输出

输入内容
字符数: 0
码点数: 0
转换结果
字符数: 0

字符码点详情(点击复制)

输入文本后显示每个字符的码点

什么是 Unicode?

Unicode(统一码)是计算机科学领域的一项业界标准,它对世界上大部分的文字系统进行了整理、编码。每个 Unicode 字符都有一个唯一的数字编号,称为码点(Code Point),通常用十六进制表示,加上 U+ 前缀,如 U+4E2D 表示汉字「中」。Unicode 编码转换工具可以将文本转换为各种 Unicode 表示格式,也可以将 Unicode 编码还原为文本。

如何使用

步骤

  1. 在输入框输入或粘贴要转换的文本
  2. 选择转换方向:文本转 Unicode 或 Unicode 转文本
  3. 选择输出格式:\uXXXX 或 U+XXXX(编码时可用)
  4. 结果自动生成,一键复制或交换输入输出

编码说明

  • Unicode 转义格式对代码和调试有用,但可能降低普通文案的可读性。
  • 解码时,请检查代理对和 Emoji 输出;拆分代理对可能导致乱码。

使用场景

将文本编码为 Unicode 转义格式将文本转换为 JavaScript 风格的 \uXXXX 序列或 U+XXXX 码点表示法。转义模式下 U+FFFF 以上的字符会显示为代理对,但详情网格仍显示其完整码点。转换是本地的 String.prototype.codePointAt 和 fromCodePoint 操作,字符数据始终保留在本地,直到你自行复制转义输出。
将 Unicode 转义解码为可读文本解码 \uXXXX、\u{. } 和 U+XXXX 模式为字符,然后复制还原后的文本。适用于检查日志、JSON 字符串、本地化文件以及来自代码或 API 的转义片段。解码通过页面内的 fromCharCode 和 fromCodePoint 完成,源字符串和重建的字符永远不会离开浏览器标签页——当片段包含内部文案或未发布的产品名称时很有用。
检查单个码点详情每个输入字符都会列出其可见字符和 U+ 值,点击即可复制该码点。字符数和码点数分别显示,这对 emoji 和其他多单元字符很重要。由于网格是通过遍历内存中的输入字符串构建的,整个码点映射完全在本地渲染,无需将文本发送到第三方 Unicode 查询服务。
发现乱码和双重编码字符串粘贴看起来像 'é' 或 '中文' 的字符串,进行解码,然后用疑似原始编码(UTF-8 与 Latin-1)重新编码,确认源数据是双重编码还是在捕获时就已乱码。检查完全在浏览器端完成:TextDecoder、码点迭代和重新编码都在页面中进行,因此从日志中提取的生产字符串无需上传即可分析。
将 emoji 和组合标记按码点计数使用码点网格识别占用多个槽位的家庭 emoji、国旗序列和组合变音符号。单独的字符计数和码点计数可以解释为什么一个「1 个字符」的字符串可能占用 7 个 UTF-16 单元。由于计数是对输入的本地迭代,即使是包含敏感内容的字符串也可以在不离开浏览器的情况下为数据库列或传输格式预算确定大小。

技术原理

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 数据库,不会上传任何内容。