【问题标题】:Can a base64 encoded string contain whitespace?base64 编码的字符串可以包含空格吗?
【发布时间】:2010-06-22 09:56:21
【问题描述】:

base64 编码的字符串可能包含空格吗?具体来说,它是否可以在字符串的 end 处包含空格?

PS。我正在考虑整个“MySQL 将在 VARCHAR 字段中存储字符串时修剪尾随空格”;-)

【问题讨论】:

  • P'raps 我的意思是“做”多于“可以”;-)
  • 好吧,您可以根据实现添加空格,但大多数情况下它们会被剥离,因为它们实际上是有效的,因为它们不是 b64“字母表”的一部分,但通常包含用于显示目的,“可读性”实际上并没有击中它,因为“正常”人类首先无法读取 b64 字符串

标签: php mysql encoding whitespace base64


【解决方案1】:

不,它不能。有关base64 使用的允许字符库,请参见Base64,它们是字符A-Za-z0-9+/(最后两个可能因实现而异)为以及填充字符 =(但这也取决于实现,因为某些实现根本不使用填充)。

【讨论】:

  • 是的,它们不属于代码,但在大多数实现中,它们可以添加以保持可读性。大多数解码器会忽略空格。
  • 是的,这是真的,但是它们对编码字符串并不重要,这意味着它们可以安全地被忽略,并且 MySQL 或任何将它们剥离的人都没有关系。 OP 的意图显然是将 base64 编码的字符串存储在 MySQL VARCHAR 列中,这绝对可以保存。
  • 谢谢伙计们,我的意思是更多“确实”base64 字符串包含空格 - 而不是“可以” - 我的错。所以总而言之,它可以,但它们无关紧要。 :-) 我现在明白了
  • 对于字符串 "apfjxkic-omyuobwd339805ak:60a06cd2ddfad610b9490d359d605407" base 64 会输出一个 "\n",我不知道为什么
  • 正如Gavin Jackson 下面提到的,如果您的base64 字符串中有意外的空格,那么很可能是URL 解析将其从+ 转换为空格的结果。一个简单的$str = str_replace(' ', '+', $str) 在你base64_decode($str) 之前将解决它。
【解决方案2】:

它不应该,但它可能会。

有效的 base64 字符串不应包含空格,因为编码字母表应仅包含 A-Z a-z 0-9 + /

但是,如果编码数据恰好包含“+”字符,并且数据是在 URL 中传递的,则可能会无意中将其转换为空格。因此,在这种情况下,您可能会遇到一个假定的 base64 字符串,其中似乎有空格。

如果是这种情况,只需在解码前用加号替换空格即可。

PS。我在这里考虑整个“MySQL 将在 VARCHAR 字段中存储字符串时修剪尾随空格”

顺便说一句,从 MySQL 5.0.3 开始,varchar 的尾随空格不会被随意剥离

【讨论】:

  • 这应该不是问题,但是如果你使用 URL 安全的 Base64 编码算法:)
  • +1 用于提及“+”/空格问题。刚刚提供了一个 URL 提供的 Base64 字符串,其中 + 转换为空格。
  • 这个我快疯了。谢谢!
  • 我在 base64 字符串中有一个空格(由于 json 编码/解码),这篇文章为我解决了这个问题。这应该在接受的答案中提及,因此我将建议进行编辑以包含此内容。
【解决方案3】:

是的。 Base64 编码的字符串可以包含空格,但字符不重要。所以数据库修剪空格就可以了。

事实上,最初的 MIME 规范建议将 Base64 字符串分解为 72 个字符的行。 XML 的 base64Binary 还可能包含换行符、制表符、空格。

在 PHP 中,base64_decode() 会去除所有空白字符,因此您不必担心。

【讨论】:

    【解决方案4】:

    维基百科暗示 Base64 编码有无数种变体:

    http://en.wikipedia.org/wiki/Base64

    所以答案可能取决于您需要对字符串做什么。但我敢说你是用 base64_encode() 在 PHP 中创建的,所以附加空格似乎是安全的:

    <?php
    
    $original_data = 'Lorem ipsum dolor sit amet';
    $encoded_data = base64_encode($original_data);
    $padded_data = '    ' . chunk_split($encoded_data, 3, '  ') . '    ';
    
    echo base64_decode($padded_data); // Prints 'Lorem ipsum dolor sit amet'
    
    ?>
    

    【讨论】:

    • 我想这是一种迂回的证明方式!谢谢
    【解决方案5】:

    据我所知,它不能。基本上,Base64 字符串必须由一组 64 个字符构成。 A-Z、a-z、0-9 等于 62 - 其他两个取决于实现。

    据我所知,现在有一个使用空格作为字符的实现。主要原因是可读性 - 即 Base64 字符串必须易于打印和识别。

    您可能会在 Wikipedia 上找到有关它的更多信息。

    【讨论】:

      【解决方案6】:

      不,但是 - base64 实用程序的某些实现会在输出中添加换行符,这会使空格看起来好像是输出的一部分。如果您遇到这种情况,根据您的 base64 版本,您可以通过执行以下操作之一关闭此行为或删除换行符:

      base64 -w 0 < input.txt
      base64 < input | tr -d \\n
      

      查看这个问题了解更多详情:https://superuser.com/questions/1225134/why-does-the-base64-of-a-string-contain-n/1225334

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多