base64编码:输入字符

时间:2010-08-17 19:15:32

标签: encoding character-encoding base64

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

对标准是什么感到有点困惑。

2 个答案:

答案 0 :(得分:8)

从根本上说,谈论“base64编码字符串”是错误的,其中“字符串”是指 text

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

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

答案 1 :(得分:7)

对我而言,(第一篇)链接文章有一个基本问题:

  

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

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

此外,他对'ASCII'的检查实际上允许从80ff的所有内容,这些内容不是ASCII - ASCII只是007f。< / p>

现在,如果你有一个你检查的字符串是纯ASCII,那么你可以安全地将它作为其中字符的ASCII值的字节序列 - 但这是一个单独的早期步骤,没有严格要做使用base64编码的行为。

(我应该说我就像他一再敦促读者注意到base64编码任何形状或形式的加密