企评社

Язык подписей интерфейса: Русский. Отзывы о компаниях, сообщения форума и описания инструментов пока доступны только на китайском языке.

Преобразование кодировок

Base64, кодирование URL, HTML-сущности, экранирования Unicode, hex и разбор JWT — шесть вкладок, оба направления

所有编解码都在你的浏览器里完成,不上传、不留存

六个标签页都只在你的浏览器里算:不提交表单、不请求接口、不写 localStorage 或网址参数。 Base64 与 JWT 里常常藏着密钥、token 或账号信息,编解码放在本地完成,是这页唯一的正确做法。

Base64 编解码

按 UTF-8 字节编码,所以中文与 emoji 都能正确往返。开「URL-safe」会把 + 换成 -、/ 换成 _(放进网址参数或文件名时用),开「去掉末尾的等号」会省略补位的 =。

文件 → Base64 / Data URL(文件不会离开你的设备)
把文件拖到这里,或点击选择文件
任意类型;只读字节并转成 Base64,不上传服务器

这几种「编码」到底在解决什么问题

Base64 不是加密,只是「换个字母表」。每 3 个字节切成 4 个 6 位再查表,于是二进制变成只含 A-Z、a-z、0-9、+、/ 与补位 = 的纯文本,长度涨约三分之一。谁都能一步还原,所以它只解决「二进制进不了文本协议」,不解决保密。变体两个:URL-safe 用 - 与 _ 代替 + 与 /;补位 = 可省,解码端按长度补回即可。

URL 编码为什么必须存在。网址里 ? & = # 有语法含义,参数值含这些字符就会被当结构解析——搜「A&B」时服务端会收到两个参数。所以值里的保留字符写成 %XX,非 ASCII 先按 UTF-8 变字节再转义。编码一个参数值用 encodeURIComponent(把 / ? & = 都编码掉,最安全),编码一整条网址才用 encodeURI(保留分隔符);表单口径的空格是 +,本页给了开关。

HTML 实体防的是注入。把用户内容直接拼进页面,一段含 script 的输入就会被执行(XSS);转义 &、<、>、" 与单引号即变回纯文本。其中 & 必须第一个替换,否则刚生成的 &lt; 会被再转一次成 &amp;lt;。解码要同时认十进制 &#20013; 与十六进制 &#x4E2D; 两种数字写法,以及命名实体。

Unicode 转义与代理对。JS 字符串以 UTF-16 为单位,\uXXXX 只能写到 FFFF;超出 BMP 的 emoji 占两个单位,所以 😀 的 4 位写法是 \uD83D\uDE00——两个转义合起来才是一个字符,只写 \uD83D 是半个字符;ES6 起可用码点写法 \u{1F600} 一次表示完。同理 '😀'.length 是 2 而不是 1。

Hex 与「字节」的关系。十六进制把每个字节写成两位,和 Base64 一样是编码不是加密,只是长两倍却更好核对。按 UTF-8 口径一个汉字占 3 字节,「中文」= e4b8ad e69687;同一个字按 GBK 是 d6d0,两边对不上时先确认编码口径,而不是怀疑工具。

JWT 三段结构与「解析不等于校验」。JWT 是三段 Base64URL:header 说算法与类型,payload 放声明(iss、sub、exp、iat、nbf 及业务字段),signature 是用密钥对前两段算出的签名。前两段只是编码,谁都能解开、也谁都能改,「解得开」和「没被改过」是两件事——真正的校验必须在服务端重算签名、防 alg 被改成 none、核对 iss 与 aud。

为什么这页坚持不上传。Base64 的原文常是密钥或证书、JWT 里一定带 token 与账号信息、URL 里常含回调地址与签名串。本页计算全是页面内的一段纯 JavaScript(写在源码的 PURE 区块里):打开 Network 面板除静态资源外没有任何请求,也不写 localStorage、不把内容放进网址参数,关掉页面即消失。

Частые вопросы

Base64 - это шифрование? Им можно защитить пароли?

Не шифрование, а кодирование: любую строку Base64 кто угодно за один шаг разворачивает обратно, ключ не нужен. Записывать пароль или секрет в базу или конфиг в Base64 - то же самое, что открытым текстом. Для тайны нужна настоящая криптография (например AES-GCM) плюс бережное хранение ключа; Base64 пригоден лишь для того, чтобы двоичные данные влезли в текстовые протоколы.

Почему у одних строк Base64 в конце стоит =, у других нет? Что за URL-safe?

Base64 кодирует каждые 3 байта в 4 символа; когда байтов не кратно трём, хвост добивается знаками = - поэтому их бывает от 0 до 2, и только в конце. Во многих местах (параметры URL, имена файлов, JWT) выравнивание выбрасывают; при декодировании его восстанавливают по длине - страница читает оба вида. URL-safe означает замену + и / на - и _: в URL эти два знака экранируются или принимаются за разделитель пути.

encodeURIComponent или encodeURI - что брать?

Для значения параметра - encodeURIComponent: он кодирует и / ? & = тоже, так что вставка в строку запроса структуру не ломает. Для URL целиком - encodeURI: он сохраняет разделители : / ? # & = - иначе адрес сворачивается в бесструктурную кашу. Учтите: форменная конвенция превращает пробелы в +, поэтому при декодировании строк из http-тела часто нужен переключатель «считать + пробелом».

Почему 😀 разбивается на две последовательности \u, а не на одну?

Потому что JavaScript живёт в UTF-16: \uXXXX покрывает только символы до FFFF, а 😀 - это U+1F600, за границей; его собирают из двух единиц UTF-16 (пара суррогатов): \uD83D\uDE00. Для одного экранирования на символ используйте форму кодовой точки \u{1F600}. Страница при кодировании даёт выбрать обе формы и обе читает обратно в 😀.

Мой JWT нормально декодируется - значит, токен действителен?

Нет. Заголовок и полезная нагрузка - просто JSON в Base64URL: открыть и произвольно переписать может кто угодно; «открывается» доказует лишь похожесть на JWT. Действительность проверяется на сервере: подпись ключом, плюс алгоритм, издатель и срок. Страница разбирает, но не проверяет - и строчка «не просрочен» на экране подпись на сервере не заменяет.

Почему время показано в GMT+8? Сломается ли на машине в другой зоне?

exp / iat / nbf - это Unix-метки в UTC, абсолютные моменты, не зависящие от отображаемой зоны. Страница показывает их в китайском стандартном времени GMT+8 ради единства с остальными инструментами и привычками эксплуатации, фиксированным смещением +8 - настройка часов вашей машины не участвует. Вердикты «просрочен» / «ещё не активен» считаются от текущего времени машины и справочны - настоящее слово за сервером.

Похожие инструменты