Base64 和 URL 编码有什么区别?各自该在什么时候用

两种编码,两个任务 Base64 和 URL 编码都会把「不安全」的字符替换成安全字符。这种表面相似,正是它们经常被搞混的原因——要么该用一种却用了两种,要么干脆用错了。 一句话版本: Base64 让二进制数据能通过只支持文本的通道 百分号编码 让文本能安全地放进 URL 各自到底做了什么 Base64 用 64 个字符的字母表(A–Z a–z 0–9 + /,末尾用 = 补齐)重写字节。每 3 个字节变成 4 个字符,体积因此增加约 33%。 Man → TWFu Hello → SGVsbG8= 百分号编码把在 URL 里不安全的字符替换成 % 加两位十六进制数(对应 UTF-8 字节)。 a b → a%20b 书签管理 → %E4%B9%A6%E7%AD%BE%E7%AE%A1%E7%90%86 a&b → a%26b 关键区别 Base64 百分号编码 目的 让二进制穿过文本通道 让文本安全地待在 URL 里 字符集 固定的 64 个字符 任意字节,写成 %XX 体积变化 +33% 变化很大 谁能还原 任何人 任何人 提供安全性 否 否 常见位置 JSON 字段、data URI、邮件附件、JWT 查询参数、路径片段 什么时候用 Base64 把小块图片以 data URI 内嵌进 CSS 或 HTML 在 JSON 里传文件、缩略图或签名 通过 MIME 发邮件附件 构造 Authorization: Basic 请求头 JWT 的 header 与 payload 段 需要双向转换时,直接用 Base64 编解码工具,不用装任何东西。 ...

September 12, 2026 · 1 min · 212 words · NavProject Team

Unix 时间戳是什么?怎么转换成日期时间

一串看不出含义的数字 1735689600 是一个合法的时间,1735689600000 也是。两者含义相差 1000 倍,肉眼看不出区别——这正是最容易踩的第一个坑。 它们都是 Unix 时间戳:从 1970-01-01T00:00:00Z(纪元时间)起经过的时间。数据库存它、接口返回它、日志里全是它,但人脑读不了它。 秒还是毫秒? 知道规则就很简单: 位数 单位 大致对应 10 位 秒 2001 → 2286 年 13 位 毫秒 同样日期,数值 ×1000 JavaScript 的 Date.now() 返回毫秒,而多数后端语言和 Unix 命令返回秒。这个不匹配是经典 bug:毫秒值除以 1000 会得到 1970 年附近的日期,秒值当成毫秒用同样会落到 1970 年。 Unix 时间戳转换工具 会自动识别位数,两种都显示。 为什么转换出来"不对":时区 时间戳本身没有时区,它表示一个绝对时刻;是渲染方式带了时区。 2026-01-01T00:00:00Z(UTC)在北京是 2026-01-01 08:00:00 在纽约是 2025-12-31 19:00:00 所以当时间戳"显示成了前一天",问题几乎总是:少写了 Z、缺了时区偏移,或者服务端按本地时间格式化而客户端按 UTC 理解。 转换工具会把 ISO 8601(UTC) 和 本地时间 两行并排显示,差异一眼可见。 实际使用中的几个场景 数据库:存 UTC,按用户时区渲染。存本地时间是少数几个很难挽回的日期决策之一。 日志:请求旁边那个 10 位数字,基本都是秒级 epoch 时间。 接口:看字段名——created_at、createdAt、timestamp 常常是 epoch 值,但单位不能靠猜,看位数。 ...

September 12, 2026 · 1 min · 153 words · NavProject Team

JSON 怎么格式化和校验?常见错误与修复方法

为什么 JSON 总是难以阅读 每个接口返回、每份配置文件、每行日志都是 JSON。压缩后它是一整块字符墙;格式化之后同样的数据两秒就能扫完。数据完全相同,差的只是空白——这也是「JSON 格式化」成为开发者最常用搜索之一的原因。 格式化、压缩、校验的区别 操作 改什么 什么时候用 格式化 加缩进和换行 阅读、评审、排查问题 压缩 去掉所有多余空白 传输、存储配置 校验 不改内容,只报语法错误 提交请求体或配置文件之前 这三件事在 JSON 格式化工具 里都只差一次点击,而且全程在浏览器本地完成。 什么才算合法的 JSON JSON 的语法非常小,而且比 JavaScript 严格得多: 键名必须用双引号包起来 字符串必须用双引号,单引号不合法 不允许多余的逗号 不允许注释(// 和 /* */ 都不行) 值只有这几种:对象、数组、字符串、数字、true、false、null 数字不能有多余的前导零,NaN / Infinity 也不是合法值 如果你写过 JSON5、JSONC(VS Code 配置)或者 JavaScript 对象字面量,其中一些习惯在 JSON 里是非法的。 最常踩的五个错误 1. 多了一个逗号 { "name": "NavProject", "version": "1.0", } "1.0" 后面那个逗号,是 JSON 报错的第一大来源。 2. 用了单引号 { 'name': 'NavProject' } JavaScript 合法,JSON 非法。 3. 键名没加引号 { name: "NavProject" } 同样:JavaScript 合法,JSON 非法。 ...

September 12, 2026 · 1 min · 160 words · NavProject Team

URL 编码(百分号编码)完全指南:查询参数怎么正确转义

一个典型的坏链接 你拼了一个搜索链接,英文下一切正常,用户一输入中文就崩: https://example.com/search?q=书签管理 & page=2 服务器收到的 q 是 书签管理 ,还多了一个叫 page 的参数——本该属于查询值的 & 被当成了分隔符。#、=、?、+ 和空格也有同样的问题。 解决办法是百分号编码(URL 编码):把不安全字符替换成 % 加两个十六进制数字,表示它的 UTF-8 字节。 书签管理 → %E4%B9%A6%E7%AD%BE%E7%AE%A1%E7%90%86 & → %26 空格 → %20 哪些字符是安全的 RFC 3986 把字符分成"未保留"和"保留"两类,只有未保留字符可以原样出现: 类别 字符 说明 未保留 A–Z a–z 0–9 - _ . ~ 任何位置都安全 保留(结构类) : / ? # [ ] @ 在 URL 中有结构含义 保留(子分隔符) ! $ & ' ( ) * + , ; = 在查询串中有含义 其他 空格、"、<、>、%、{}、中文… 必须编码 保留字符不是"不能用",而是"有含义"。关键问题永远是:这个 & 是想表达结构,还是想表达数据?如果是数据,就编码它。 ...

September 10, 2026 · 1 min · 204 words · NavProject Team

Base64 编码是什么?原理、用途与在线工具使用指南

Base64 要解决什么问题 很多系统只传"文本":邮件协议为 7 位 ASCII 设计,JSON 定义为文本,HTML 属性里放的是字符串。但我们真正想传输的东西——图片、PDF、密钥、二进制协议数据——是字节流,里面很容易混进控制字符、引号和换行。 把原始二进制直接塞进文本通道,迟早会出问题:换行被改写、引号提前结束字符串、代理服务器吃掉一个字节。Base64 的做法是:只用 64 个所有文本系统都认的字符重新表示这些字节。 A–Z a–z 0–9 + / 末尾的 = 只用于补齐。整个字母表就这些。 Base64 的原理 Base64 每处理 3 个字节(24 位),就把它们重写成 4 个字符(4 × 6 位): 输入 位数 输出 Man 24 位 TWFu Ma 16 位 + 补齐 TWE= M 8 位 + 补齐 TQ== 由此直接得到两个结论: 结果大约比原文大 33%(3 个字节变成 4 个字符); = 的数量告诉解码器最后一组缺了几字节,一个或两个 = 表示末尾不完整。 Base64 是可逆的、完全公开的编码,没有密钥,也没有任何保密性。 日常开发中在哪里遇到 Base64 Data URI:background-image: url(data:image/png;base64,...) 把小图标直接内嵌进 CSS。 JSON 接口:在 JSON 字段里传文件、缩略图或签名。 邮件附件:MIME 用 Base64 编码附件,让它们能穿过只支持文本的邮件服务器。 HTTP Basic 认证:Authorization: Basic dXNlcjpwYXNz 就是 user:pass 的编码结果。 JWT:Token 的 header 和 payload 两段都是 Base64URL 字符串。 Base64 不是加密 这是最重要的一点:Base64 不提供任何保密性。 ...

September 10, 2026 · 1 min · 209 words · NavProject Team