我正在尝试了解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.");
}
他在文章的另一个单独部分提供了RFC 3548的链接,但除了以下内容之外我没有看到任何输入要求:
实现必须拒绝编码,如果它包含字符 在解释基本编码数据时,在基本字母表之外,除非 参考本文件的规范明确说明 否则。
不确定“基本字母”是什么意思,但也许这就是Zakas所指的。但是,通过说他们必须拒绝编码,它似乎暗示这是已经编码而不是输入的东西(当然如果输入无效,它也会出现在编码中,所以也许这一点没有实际意义)。
对标准是什么感到有点困惑。
答案 0 :(得分:8)
从根本上说,谈论“base64编码字符串”是错误的,其中“字符串”是指 text 。
Base64编码应用于二进制数据(一个字节序列,如果你想要更加挑剔,则为八位字节),结果是文本。输出中的每个字符都是可打印的ASCII文本。 base64的重点是提供一种安全的方法,将任意二进制数据转换为文本格式,可以可靠地嵌入到其他文本中,传输等.ASCII几乎与所有字符集兼容,因此您不太可能无法使用将ASCII文本编码为其他内容的一部分。
当有人谈到“base64编码字符串”时,他们真的在谈论使用一些现有编码(例如UTF-8)将文本编码为二进制文件,然后对结果应用base64编码。当解码时,您需要将base64解码回二进制,然后使用原始编码解码该二进制数据,以获取原始文本。
答案 1 :(得分:7)
对我而言,(第一篇)链接文章有一个基本问题:
在尝试对字符串进行base64编码之前,应检查该字符串是否仅包含ASCII字符
您没有base64编码字符串。您base64编码字节序列。当你处理任何类型的编码工作时,记住这种差异是非常重要的。
此外,他对'ASCII'的检查实际上允许从80
到ff
的所有内容,这些内容不是ASCII - ASCII只是00
到7f
。< / p>
现在,如果你有一个你检查的字符串是纯ASCII,那么你可以安全地将它作为其中字符的ASCII值的字节序列 - 但这是一个单独的早期步骤,没有严格要做使用base64编码的行为。
(我应该说我做就像他一再敦促读者注意到base64编码不任何形状或形式的加密)