piapia123
zh

UTF-8 字节与编码对照

编码

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

把一段文字的各种表示并排列出来:UTF-8 字节、Unicode 码点、URL 用的百分号编码、HTML 实体(十进制与十六进制)、JS / Java 的 `\u` 转义。它不是一个转换器 —— 单独要做某一种转换,站内有更专的工具(URL 编码、HTML 实体、Unicode 转义),这里解决的是另一个问题:同一个字符的几种写法摆在一起对照。调试报文、读别人的配置、排查「为什么这个中文在那边显示成乱码」时,需要同时看到这几栏。最后一行特意把字符数和字节数分开写:这两个数字不相等,就是 UTF-8 在起作用 —— 一个汉字占 3 字节、一个 emoji 占 4 字节,而 ASCII 只占 1 字节。

功能

  • 一次给出六种表示:字节、码点、百分号编码、两种 HTML 实体、Unicode 转义
  • 每行可单独复制 —— 不用从一长串里手划选中某一段
  • 按码点切分,emoji 不会被劈成两个孤立的代理项
  • 基本平面之外的字符会写成代理对(\ud83d\ude00),能直接粘进配置文件
  • 字符数与字节数分开统计 —— 一眼看出 UTF-8 的膨胀
  • 全部在浏览器本地完成,内容不会上传

使用方法

  1. 把文字粘贴进输入框
  2. 结果实时出现,每种表示各占一行
  3. 点某一行的复制按钮取走那一个值
  4. 需要整段时点「复制全部」

常见问题

为什么字符数和字节数不一样?
因为 UTF-8 是变长编码:ASCII 字符(英文、数字、标点)占 1 字节,拉丁扩展与希腊文占 2 字节,汉字等占 3 字节,emoji 和生僻字占 4 字节。所以「你好」是 2 个字符、6 个字节;「a中😀」是 3 个字符、8 个字节。数据库里 `varchar(10)` 是按字符算的,存 10 个汉字没问题;但如果字段是 `varchar(10 bytes)` 或按字节截断,就只能装下 3 个汉字 —— 这类问题的根源都在这一行。
这和 URL 编码工具有什么区别?
百分号编码这一行和它是一样的,但定位不同:`url-encode` 是转换器,带着「哪些字符需要编码」「空格用 + 还是 %20」这些选项,输出就是结果本身;这里是对照表,把同一份内容的六种写法一次列全,方便横向比较。要做转换请用专门的工具,要「看清这串东西到底是什么」用这里。
emoji 的转义为什么是两段?
因为 😀 的码点 U+1F600 超出了基本多文种平面(U+FFFF 以上),而 JavaScript、Java 用的 UTF-16 里一个码元只有 16 位,装不下它 —— 所以必须写成一对代理项 `\ud83d\ude00`。另有 `\u{1F600}` 这种写法更短,但 Java 的 properties 文件、老 JSON 解析器和不少模板引擎都不认。本工具选择输出代理对,因为「粘进配置文件里能用」是这里最常见的用途。
HTML 实体为什么有两种?
十进制 `中` 和十六进制 `中` 指的是同一个字符,浏览器都认。区别只在习惯:网页源码里两种都常见,而某些老编辑器或模板引擎只认其中一种。两种都列出来,省得你为了迁就某个工具再转一次。

相关工具