Base64和URL编码

本文探讨了URL为什么使用百分号编码(URL编码),解释了不安全和保留字符的原因,并介绍了Base64编码的原理和用途。百分号编码用于兼容和保护URL中的特殊字符,而Base64则使8Bit字节码数据能在文本通道中传输。URL编码局部处理,使用%作为前缀以便解码,而Base64提供了一种不可读的数据表示方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

URL为什么使用百分号编码(URL编码)

1、一些数据(二进制串)无法在URL中使用字符表示(以US-ASCII字符集举例,其中的一些 字符 并不能显示的表示出来,如响铃)
2、传输的字符是URL中保留的字符(如URL解析时使用 / 作为分隔符)
3、不安全的字符(这个是由于不同的文本处理程序对于文本可能会有不同的规则,如为了防止无用的空格输入,我们在写程序的时候可能会去掉文本的前后空格)


 1)rfc文档 : https://www.rfc-editor.org/rfc/rfc1738 

No corresponding graphic US-ASCII
        URLs are written only with the graphic printable characters of theUS-ASCII coded character set. The octets 80-FF hexadecimal are notused in US-ASCII, and the octets 00-1F and 7F hexadecimal representcontrol characters; these must be encoded.

Unsafe:
        Characters can be unsafe for a number of reasons.  The spacecharacter is unsafe because significant spaces may disappear andinsignificant spaces may be introduced when URLs are transcribed ortypeset or subjected to the treatment of word-processing programs.The characters

### Base64URL 编码解码方法 Base64URL 是一种经过修改的 Base64 编码方式,主要用于 URL 文件名的安全性。它通过替换标准 Base64 中的 `+` `/` 字符为 `-` `_` 来避免在 URL 场景下引起歧义,并移除结尾可能出现的填充字符 `=`。 以下是 Python JavaScript 实现 Base64URL 编码解码的具体方法: --- #### **Python 的 Base64URL 编码与解码** Python 提供了内置的 `base64` 模块来支持 Base64URL 编码解码操作。具体实现如下所示[^1]: ```python import base64 # 原始数据 data = b"Hello, world!" # Base64URL 编码 encoded_data = base64.urlsafe_b64encode(data).rstrip(b'=') print(f"Encoded Data (Base64URL): {encoded_data.decode()}") # Base64URL 解码 decoded_data = base64.urlsafe_b64decode(encoded_data + b'===') print(f"Decoded Data: {decoded_data.decode()}") ``` 在此代码片段中: - `base64.urlsafe_b64encode()` 函数用于执行 URL 安全的 Base64 编码。 - `.rstrip(b'=')` 移除了可能存在的填充字符 `=`. - 在解码过程中重新添加必要的填充字符以确保兼容性。 --- #### **JavaScript 的 Base64URL 编码与解码** JavaScript 可以利用其原生的 `btoa` `atob` 方法完成基本的 Base64 编码解码,但对于 Base64URL,则需手动调整特殊字符。示例如下[^3]: ```javascript // 原始字符串 const string = "Hello, world!"; // Base64URL 编码 function toBase64Url(str) { return btoa(str) .replace(/\+/g, '-') // 将 '+' 替换为 '-' .replace(/\//g, '_'); // 将 '/' 替换为 '_' } const encodedData = toBase64Url(string); console.log(`Encoded Data (Base64URL): ${encodedData}`); // Base64URL 解码 function fromBase64Url(base64urlStr) { let base64Str = base64urlStr.replace(/-/g, '+').replace(/_/g, '/'); while (base64Str.length % 4 !== 0) { base64Str += '='; // 补充缺失的 '=' } return atob(base64Str); } const decodedData = fromBase64Url(encodedData); console.log(`Decoded Data: ${decodedData}`); ``` 此代码实现了以下功能: - 自定义函数 `toBase64Url` 对原始 Base64 结果中的 `+` `/` 进行替换。 - 自定义函数 `fromBase64Url` 则恢复这些字符并补充潜在丢失的填充字符 `=`. --- ### 总结 无论是 Python 还是 JavaScript,在处理 Base64URL 数据时都需要特别注意编码后的字符集差异以及填充字符的存在与否。上述两种语言均提供了简单易用的方式来进行这种转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值