Rob*_*Rob 2 base64 encoding character-encoding
我试图了解base64编码的输入要求.Nicholas Zakas,我非常尊重这里有一篇文章,他引用了一个规范,如果输入包含代码高于255的任何字符,则应该抛出一个错误Zakas Article on base64
在尝试对字符串进行base64编码之前,应检查该字符串是否仅包含ASCII字符.由于base64编码每个输入字符需要8位,因此无法准确表示代码高于255的任何字符.规范表明在这种情况下应该抛出一个错误:
if (/([^\u0000-\u00ff])/.test(text)){
throw new Error("Can't base64 encode non-ASCII characters.");
}
Run Code Online (Sandbox Code Playgroud)
他在文章的另一个单独部分提供了一个链接到RFC 3548但我没有看到任何输入要求,除了:
如果在解释基本编码数据时实现包含基本字母表之外的字符,则必须拒绝编码,除非引用本文档的规范另有明确说明.
不确定"基本字母"是什么意思,但也许这就是Zakas所指的.但是,通过说他们必须拒绝编码,它似乎暗示这是已经编码而不是输入的东西(当然如果输入无效,它也会出现在编码中,所以也许这一点没有实际意义).
对标准是什么有点困惑.
从根本上说,谈论"base64编码字符串"是错误的,其中"字符串"是指文本.
Base64编码应用于二进制数据(一个字节序列,如果你想要更加挑剔,则为八位字节),结果是文本.输出中的每个字符都是可打印的ASCII文本.base64的重点是提供一种安全的方法,将任意二进制数据转换为文本格式,可以可靠地嵌入到其他文本中,传输等.ASCII几乎与所有字符集兼容,因此您不太可能无法使用将ASCII文本编码为其他内容的一部分.
当有人谈到"base64编码字符串"时,他们真的在谈论使用一些现有的编码(例如UTF-8)将文本编码为二进制,然后对结果应用base64编码.当解码,你需要以base64解码为二进制,然后解码与原始编码的二进制数据,以获得原始文本.
对我来说,(第一个)链接文章有一个根本问题:
在尝试对字符串进行base64编码之前,应检查该字符串是否仅包含ASCII字符
您没有base64编码字符串.你base64编码字节序列.当你处理任何类型的编码工作时,记住这种差异是非常重要的.
此外,他的"ASCII"检查实际上是通过一切从让80到ff,这是不ASCII - ASCII只有00到7f.
现在,如果你有一个你检查的字符串是纯ASCII,那么你可以安全地将它作为其中字符的ASCII值的字节序列 - 但这是一个单独的早期步骤,与该行为没有任何关系base64编码.
(我应该说我做喜欢他的一再催促下,为读者注意,base64编码是不以任何形式的加密)
| 归档时间: |
|
| 查看次数: |
3173 次 |
| 最近记录: |