base64编码:输入字符

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所指的.但是,通过说他们必须拒绝编码,它似乎暗示这是已经编码而不是输入的东西(当然如果输入无效,它也会出现在编码中,所以也许这一点没有实际意义).

对标准是什么有点困惑.

Jon*_*eet 8

从根本上说,谈论"base64编码字符串"是错误的,其中"字符串"是指文本.

Base64编码应用于二进制数据(一个字节序列,如果你想要更加挑剔,则为八位字节),结果是文本.输出中的每个字符都是可打印的ASCII文本.base64的重点是提供一种安全的方法,将任意二进制数据转换为文本格式,可以可靠地嵌入到其他文本中,传输等.ASCII几乎与所有字符集兼容,因此您不太可能无法使用将ASCII文本编码为其他内容的一部分.

当有人谈到"base64编码字符串"时,他们真的在谈论使用一些现有的编码(例如UTF-8)将文本编码为二进制,然后对结果应用base64编码.当解码,你需要以base64解码为二进制,然后解码与原始编码的二进制数据,以获得原始文本.


Aak*_*shM 7

对我来说,(第一个)链接文章有一个根本问题:

在尝试对字符串进行base64编码之前,应检查该字符串是否仅包含ASCII字符

您没有base64编码字符串.你base64编码字节序列.当你处理任何类型的编码工作时,记住这种差异是非常重要的.

此外,他的"ASCII"检查实际上是通过一切从让80ff,这是不ASCII - ASCII只有007f.

现在,如果你有一个你检查的字符串是纯ASCII,那么你可以安全地将它作为其中字符的ASCII值的字节序列 - 但这是一个单独的早期步骤,与该行为没有任何关系base64编码.

(我应该说我喜欢他的一再催促下,为读者注意,base64编码是以任何形式的加密)