onlinetools.dev

Unicode 字符检查器

查看每个字符的码点、UTF-8/UTF-16 字节与转义写法

本地运行
loading…
关于此工具

粘贴任意文本,看每个字符被解剖:码点(U+XXXX)、UTF-8 字节、UTF-16 单元、JavaScript 转义序列、HTML 实体和一般类别——外加码点数、UTF-16 单元数、UTF-8 字节数和用户感知字符(字素簇)的总计。

这是应对「这个字符串怎么怪怪的?」时刻的工具:不可见字符(零宽空格、BOM、方向标记)显形为可见的行;形近字符(西里尔 а 对拉丁 a)暴露出不同码点;一个「就是一个字符」的 emoji 原来是七个用零宽连接符拼起来的码点。

四种不同的长度总计回答了那个永恒问题:为什么 JavaScript 的 .length、数据库的字节限制、和用户眼中的长度总是各说各话。

常见问题

为什么 JavaScript 里 "🎉".length === 2?
JavaScript 字符串按 UTF-16 码元计数。超出 U+FFFF 的字符——包括大多数 emoji——需要一个代理对,即两个码元。检查器同时显示两个码元和真实码点,摘要里也分开统计。
什么是字素簇?
读者感知为一个字符的东西。é 可以是两个码点(e + 组合重音),家庭 emoji 可以是七个以上用零宽连接符连起来的码点。字素计数使用浏览器的 Intl.Segmenter——最接近「用户眼中的字符」的东西。
怎么找出字符串里的不可见字符?
贴到这里——每个码点占一行,包括零宽空格(U+200B)、不换行空格(U+00A0)、BOM(U+FEFF)和方向标记,每个都标注类别。这些正是「看起来一样」的字符串通不过相等比较的经典元凶。
UTF-8 字节序列能告诉我什么?
将被存储或传输的确切内容:ASCII 一字节,多数拉丁扩展两字节,中日韩三字节,emoji 四字节。如果系统在序列中间截断,就会出现替换字符(�)——字节视图能显示这种截断会落在哪里。
相关工具