代码

Base64 编码与解码指南:UTF-8、Base64url 和错误处理

ToolMellow ·

Base64 用有限的可打印字符表示字节。编码文本时,ToolMellow 先将格式正确的 Unicode 转换为 UTF-8 字节;解码时则要求这些字节构成有效 UTF-8 文本。粘贴输入,选择标准或 URL 安全 Base64,再点击“编码”或“解码”。转换在浏览器本地运行。

本指南说明该文本工具接受的准确格式、实用示例和常见错误。Base64 是可逆编码,不是加密或压缩。转换成功不代表令牌已认证、密码已安全保存或文件无害。下文示例是固定演示,并非对您数据的测量。

Base64 编码与解码

如何对文本进行 Base64 编码或解码

打开 Base64 编码与解码工具,粘贴文本或编码字符串。标准字母表请关闭 URL 安全 Base64;接收格式要求 Base64url 时再启用。编码会处理整个输入,解码会将其还原为 UTF-8 文本。仅输入文字不会启动转换。

使用“复制结果”或“下载”前先检查输出。结果符合输入限制时,“将结果用作输入”会替换编辑区内容,随后可选择相反操作进行往返检查。修改输入或转换选项会使旧结果失效。“自动换行”仅改变显示方式,不改变编码字符,也不插入换行符。

  • 排查应用值前,可先用 foo 与 Zm9v 等已知示例。
  • 选择应用要求的字母表;仅有普通字母和数字时,可能无法看出字符串采用哪种变体。
  • 要求逐字节保留时请保存原件。文本导入、字符编码和额外换行都可能改变待编码内容。

Base64 如何表示字节

Base64 将每组三个字节分成四个六位值,再映射为字母表中的字符。末尾不足三个字节时需要特殊处理,可能使用填充。这些可见字符表示原始字节,并非新的语言或秘密密钥。

下表使用标准字母表,包含空字符串及一、二、三个 ASCII 字节的示例。待编码文本中的空格和换行是真实字节,会改变结果。解码相同的规范编码可恢复原始 UTF-8 文本,包括这些字符。

Base64 如何表示字节
UTF-8 文本标准 Base64
空字符串空字符串
fZg==
foZm8=
fooZm9v
HelloSGVsbG8=
😀8J+YgA==

RFC 4648:Base64、Base64url、填充与规范编码

标准 Base64 与 Base64url 的区别

两种格式都使用字母和数字。标准 Base64 的最后两个符号是 + 和 /,Base64url 则使用 - 和 _。ToolMellow 在标准模式下按需输出末尾 =,在 URL 安全模式下省略填充。例如,表中的表情在 URL 安全模式下为 8J-YgA。

解码器仅接受当前选择的字母表。两种模式都接受无填充输入或位置正确的可选填充。Base64url 并非一律禁止填充:是否必须、允许或省略由具体协议决定。请遵循应用所需格式,不要假定所有网址或令牌的约定相同。

标准 Base64 与 Base64url 的区别
属性标准模式URL 安全模式
最后两个字母表符号+ 和 /- 和 _
ToolMellow 编码填充按需包含省略
ToolMellow 解码填充正确填充或无填充正确填充或无填充
混用两种变体的符号拒绝拒绝

RFC 4648:Base64、Base64url、填充与规范编码

Unicode、表情与 UTF-8 解码

文本通过 UTF-8 转换,因此格式正确的 Unicode 输入可以往返保留重音字符、中文、阿拉伯文和表情。JavaScript 字符串长度统计 UTF-16 码元,与 UTF-8 字节长度不同。表情 😀 占两个 UTF-16 码元、四个 UTF-8 字节,生成八个带填充的 Base64 字符。

编码会拒绝未配对的 Unicode 代理码元;解码会拒绝无效 UTF-8,而不是悄悄替换错误字节。编码内容开头的 UTF-8 BOM 会在解码字符串中保留为 U+FEFF,在编辑器里可能不可见。有效文本也可能含控制字符或采用不同的 Unicode 规范化形式。Base64 不会规范化文本,也不会使内容可安全执行。

RFC 3629:UTF-8 字符编码WHATWG Encoding:TextEncoder、TextDecoder 与 BOM 处理ECMAScript:字符串长度与 isWellFormed

填充、空白与规范的未使用位

填充只能是末尾最多两个 =;带填充的长度必须能被四整除。解码器也允许具有有效结尾的无填充输入,但余数为一的长度无法表示完整字节。Zg== 和 Zg 都解码为 f,而 Zg= 格式错误。空输入对应有效的空结果。

解码前,ToolMellow 仅移除 TAB、LF、CR 和 SPACE。换页符、垂直制表符、不换行空格及其他 Unicode 空白会被拒绝。原始输入长度限制在移除空白之前检查,因此不能笼统理解为忽略所有空白。

本工具要求末尾字母表符号中未使用的位为零。它重新编码已解出的字节,并将去掉填充的结果与规范化输入比较。Zh== 会被拒绝,虽然宽松解码器可能得到与规范形式 Zg== 相同的字节。RFC 4648 允许这种严格拒绝策略;其他解码器接受某值不代表它是规范编码。

RFC 4648:Base64、Base64url、填充与规范编码WHATWG Infra:宽容的 Base64 解码WHATWG HTML:atob 与 btoa

Base64 会变大多少?哪些输入符合限制?

输入为 n 个字节时,带填充的 Base64 长度为 4 × ceil(n / 3) 个字符。零字节输出零字符;一、二、三个字节均输出四字符。较大输入的额外大小趋近三分之一,但并非每个值都恰好增加 33%。无填充的 URL 安全输出会按需去掉末尾一或两个填充字符。

大小公式计算 UTF-8 字节,编辑器限制计算 UTF-16 码元。工具允许最多 1,000,000 个输入码元,解码时在移除空白前检查。输出没有相同上限:一百万个 ASCII 字节会生成 1,333,336 个带填充字符。仍可复制或下载,但“将结果用作输入”无法加载超过输入上限的结果。

Base64 会变大多少?哪些输入符合限制?
边界实际限制或行为
编辑器/转换输入最多 1,000,000 个 UTF-16 码元
本地文件字节大小严格小于 4,000,000 字节
导入文本长度最多 1,000,000 个 UTF-16 码元
编码输出可超过输入上限,仍可复制或下载

RFC 4648:Base64、Base64url、填充与规范编码WHATWG Encoding:TextEncoder、TextDecoder 与 BOM 处理ECMAScript:字符串长度与 isWellFormed

打开文本文件不等于编码二进制文件

文件控件通过 File.text() 在本地按 UTF-8 文本读取文件。文件大小达到或超过 4,000,000 字节会被拒绝;读取后的文本超过 1,000,000 个 UTF-16 码元也会被拒绝。应用不会为此转换上传文件。文件扩展名不能证明内容是 UTF-8 文本。

普通的文件转文本读取会移除开头的 UTF-8 BOM,并替换错误的 UTF-8 序列,因此可能在编码前改变原始字节。这与 Base64 解码器拒绝无效 UTF-8、保留解码后 U+FEFF 的行为不同。处理图片、PDF、任意字节或要求逐字节恢复时,应在适用情况下使用独立的 Base64 转文件工具;此文本工作区不是原始二进制文件编码器。

W3C File API:Blob 文本读取WHATWG Encoding:TextEncoder、TextDecoder 与 BOM 处理

为什么 Base64 输入无效?

先确认预期格式,以及内容是否应解码为文本。请有意识地解析应用包装语法,不要不断删除未知字符直到不报错。这个解码器不会自动提取数据网址的载荷、令牌片段、带引号的 JSON 字符串或 HTML;这些包装有各自的解析与校验规则。

如果字母表和格式正确,但解出的字节不是 UTF-8,内容可能是二进制文件或其他字符编码。这是文本范围错误,并不证明 Base64 字节损坏。剪贴板不可用时可选中结果手动复制。不支持的浏览器或被阻止的工作线程也可能使转换无法运行;请使用受支持的当前浏览器并阅读错误信息。

为什么 Base64 输入无效?
现象可能原因下一步检查
A末尾长度不可能有效确认完整复制了该值
Zg=填充不完整使用正确填充或有效无填充输入
Zh==未使用位不为零检查原始生成方;规范形式为 Zg==
标准模式下输入 8J-YgA选择了错误字母表协议要求时使用 URL 安全模式
/w==解出的字节不是有效 UTF-8判断载荷是否为二进制
出现意外的不可见字符解码文本中的 BOM 或控制字符重用结果前检查码点

RFC 4648:Base64、Base64url、填充与规范编码RFC 3629:UTF-8 字符编码

Base64url、百分号编码与数据网址

Base64url 和百分号编码解决不同问题。百分号编码用 % 序列表示选定的网址字节;Base64url 用自己的字母表表示整个字节序列。加号变为空格特指 application/x-www-form-urlencoded 解析,并非所有网址中的通用行为。独立的网址编码与解码工具用于这类任务。

数据网址使用 data: 方案,可选媒体类型,并在载荷前放置逗号;适用时带有 Base64 标记。将完整包装粘贴到本文本解码器会无法通过字母表检查。用适当的工具解析目标载荷,并判断它是文本还是二进制。Base64 不会让嵌入脚本、文档或下载文件变得可信。

WHATWG URL:表单网址编码的解析RFC 2397:data URL 方案

JWT 片段与 HTTP Basic 都属于协议数据

紧凑 JWS 使用三个以点分隔的片段,紧凑 JWE 使用五个。解码 JWT 中的文本片段可能显示 JSON,但不会验证签名、解密内容、校验到期时间或建立授权。签名片段可以是任意字节,不一定能解码为 UTF-8。应用应遵循实际令牌协议并使用持续维护的验证库。

HTTP Basic 凭据用 Base64 表示用户名与密码序列,并有协议特定的字符编码规则。Base64 不提供保密性。本 UTF-8 文本工具无法证明凭据符合每台服务器的解释方式。不要公开真实凭据作为示例,应使用所需的安全传输和认证过程。

RFC 7515:JSON Web Signature 紧凑序列化RFC 7516:JSON Web Encryption 紧凑序列化RFC 7617:HTTP Basic 认证

Base64 不是加密、哈希或压缩

任何获得 Base64 值的人都可在没有秘密密钥的情况下还原内容。加密需要密码学算法与密钥管理;哈希生成摘要,目的与性质不同。把密码转换为 Base64 不适合密码存储。独立的哈希工具生成摘要,并非密码存储系统,也不能代替加密。

Base64 会扩大字节表示,而不是压缩。它可以承载已加密、压缩或签名的字节,却不会自行创建这些保护。添加编码层前先明确应用需求,避免在共享示例、截图和下载结果中包含秘密。

RFC 4648:Base64、Base64url、填充与规范编码

复制、下载、往返检查与清除

“下载”把结果保存为 UTF-8 文本文件 toolmellow-result.txt,不是二进制重建或转换报告。成功得到空输出时仍可使用“复制结果”和“下载”。简单检查可先编码已知文本,符合限制时将结果用作输入,再以相同字母表解码并与原文比较。

“清空”移除输入、结果、错误、查找替换内容及编辑历史,但保留 URL 安全和“自动换行”选项。刷新或关闭工作区会丢弃内存中的工作数据,已下载文件仍留在设备上。“清空”不保证从浏览器或操作系统内存中进行取证级擦除。

本地处理意味着什么?

转换在浏览器工作线程中运行。应用不会把粘贴文本、所选文件内容或转换结果发送到转换服务器。工作输入保存在当前页面中,而不是保存为账户历史。完整的存储和临时传递说明见网站隐私页面。

加载网站仍会产生网络请求。托管基础设施收到普通连接和请求元数据,公开网站使用 Google Analytics 统计页面访问,包括 Cookie 和浏览器、设备信息。本地转换不代表匿名、没有网络流量或基础设施零日志。下载文件和手动复制的结果可通过您的操作离开工作区。

将 Base64 工具嵌入网页并保留反向链接

打开工具工作区下方的集成区域,选择页面语言,再复制或下载提供的 HTML 代码片段。粘贴到允许外部 iframe 和脚本的 HTML 区域。片段包含 ToolMellow 工作区 iframe、尺寸调整脚本,以及指向同语言 ToolMellow 工具页的可见反向链接。请保留署名链接。

预览嵌入效果并检查窄屏。嵌入版保留同样的文本范围与输入限制,不是远程转换 API 或二进制文件编码器。剪贴板受浏览器权限影响,网站平台也必须允许外部资源。提供的反向链接使用 nofollow 和 noopener;存在链接并不保证搜索排名提升。

常见问题

如何将文本编码为 Base64?

粘贴格式正确的 Unicode 文本,选择标准或 URL 安全模式并点击“编码”。ToolMellow 在本地将文本转换为 UTF-8 字节后编码。可复制或下载结果文本。

如何把 Base64 解码为文本?

选择对应字母表并点击“解码”。工具校验格式与未使用位的规范性,再要求字节组成有效 UTF-8。接受正确的可选填充与无填充输入;二进制内容可能无法通过文本检查。

Base64 和 Base64url 有何区别?

最后两个字母表符号不同:标准形式使用 + 和 /,URL 安全形式使用 - 和 _。ToolMellow 按需输出标准填充,并省略 URL 安全填充。两种模式解码都接受正确填充或无填充输入。

为什么 Base64 末尾有等号?

字节数不能被三整除时,末尾一或两个等号补齐最后四字符组。填充要求取决于格式;本解码器也允许有效的无填充形式。

Base64 支持表情和非拉丁文字吗?

支持,通过 UTF-8 处理。表情占用的 UTF-16 码元数和 UTF-8 字节数可能不同。编码拒绝未配对代理码元,解码拒绝无效 UTF-8,而不是替换错误内容。

Base64 会比原数据大多少?

带填充长度为 4 × ceil(输入字节数 / 3)。较大输入的额外大小趋近三分之一,较短输入受取整影响。应计算 UTF-8 字节而非显示字符;无填充 URL 安全输出去掉末尾填充。

为什么其他解码器接受的值在 ToolMellow 中被拒绝?

解码器对字母表、空白、填充、未使用位和文本编码的接受规则不同。ToolMellow 使用所选字母表,仅移除四种指定空白,并要求未使用位为零及有效 UTF-8。其他工具宽松接受不代表输入规范。

这里能解码 PDF 或图片吗?

本工具输出 UTF-8 文本,不输出任意文件字节。需要适当的二进制重建时请使用独立的 Base64 转文件工具。此处本地文件输入读取文本,编码前可能移除 BOM 或替换无效 UTF-8。

解码时允许哪些空白?

仅移除 TAB、LF、CR 和 SPACE。换页符、垂直制表符、NBSP 及其他 Unicode 空白会被拒绝。原始一百万 UTF-16 码元限制在移除空白之前应用。

Base64 是加密或安全的密码存储方式吗?

不是。Base64 无需密钥即可还原,不提供保密性,也不是加密、密码哈希或压缩。解码认证令牌也不会验证令牌或授予权限。

为什么结果能下载却不能用作输入?

编码输出可能超过一百万 UTF-16 码元的输入上限。仍可复制和下载,但“将结果用作输入”拒绝过大的结果。一百万 ASCII 字节会生成 1,333,336 个带填充字符。

能把这个工具嵌入我的网站吗?

可以。使用工作区下方的本地化 HTML 片段,保留可见的 ToolMellow 反向链接,并确认平台允许 iframe 和尺寸调整脚本。嵌入版具有相同文本限制,不是服务器转换 API。

来源与延伸阅读

动手试试。