一个base64编码的字符串可以包含空格吗?

36

一个base64编码的字符串可能包含空格吗?特别是,它可能在字符串末尾包含空格吗?

附注:我在思考整个“MySQL在将字符串存储在VARCHAR字段中时会修剪尾随空格”的问题;-)


也许我是指“能够”而不是“可以”;-) - Dougal
你可以根据实现添加空格,但大多数情况下它们会被剥离,因为它们实际上是有效的,因为它们不是b64“字母表”的一部分,但通常包含在显示目的中,“可读性”并没有真正影响它,因为“普通”的人无法首先读取b64字符串。 - My1
6个回答

33

不可以。请参阅Base64,了解base64所使用的字符库,包括字符A-Za-z0-9+/(最后两个字符可能因实现而异),以及填充字符=(但这也取决于不同的实现方式)。


9
可以的,它们并不属于代码范畴,但在大多数实现中,可以添加空格以保持可读性。大多数解码器会忽略空格。 - jigfox
是的,这是正确的,但它们对编码字符串并不重要,这意味着它们可以安全地被忽略,MySQL或其他人剥离它们也无关紧要。显然,OP的意图是在MySQL的VARCHAR列中存储base64编码的字符串,这是绝对安全的。 - Stefan Gehrig
3
谢谢您,我理解您的意思。您想知道一个Base64字符串是否包含空格,而不是能否包含空格,这是我的错误理解。总之,Base64字符串可以包含空格,但它们不会影响字符串本身。现在我明白了。 - Dougal
对于字符串 "apfjxkic-omyuobwd339805ak:60a06cd2ddfad610b9490d359d605407",进行 base 64 编码后会输出一个 "\n",我不知道为什么。 - Tiina
4
正如Gavin Jackson在下面提到的,如果你的 base64 字符串中有意外的空格,那么很可能是由于 URL 解析将其从 + 转换成了空格。在进行 base64_decode($str) 之前,简单地使用 $str = str_replace(' ', '+', $str) 将其替换即可解决问题。 - Egg
这是一个非常误导性的回答...问题是“可以吗”,而正确的答案是“可以”。这是您所引用文档中的一句话:“换行符和空格可以出现在任何地方,但在解码时应将其忽略”。 - Igor Mikushkin

20

这不应该发生,但有可能会发生。

一个有效的base64字符串不应包含空格,因为编码字母表只应由A-Z a-z 0-9 + /组成。

然而,如果编码数据恰好包含“+”字符,并且数据被传递到URL中,则它可能会意外地转换为空格。在这些情况下,您可能会遇到一个看起来有空格的所谓base64字符串。

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

附带说一句,“MySQL在将字符串存储在VARCHAR字段中时会修剪尾随的空格”

顺便提一下,在MySQL 5.0.3中,varchar的尾随空格将不会轻易删除。


这不应该是一个问题,但如果您使用URL安全的Base64编码算法 :) - Ren
3
感谢您提到“+”和空格的问题,原文中提供了一个URL Base64字符串,其中“+”被转换为空格。 - iCollect.it Ltd
1
我对这个问题感到非常疯狂。谢谢! - Everton Lenger
我的base64字符串中有一个空格(由于json编码/解码的结果),这篇文章为我解决了这个问题。这应该在被接受的答案中提到,所以我打算建议编辑以包括这一点。 - Egg
这是我的情况。客户端的API有时会加入一个空格,这让我疯狂地转换那些base64编码。 - IcyHerrscher

4

是的。Base64编码的字符串可以包含空格,但字符不重要。因此,如果数据库修剪空格,那就没问题。

事实上,最初的MIME规范建议将Base64字符串分成每行72个字符。XML的base64Binary也可以包括换行符、制表符和空格。

在PHP中,base64_decode()会删除所有空白字符,因此您不必担心这个问题。


1

维基百科建议,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'

?>

我想这是一种迂回的证明方式!谢谢。 - Dougal

1

0
据我所知,它是不可能的。基本上,Base64字符串必须由一组64个字符构成。A-Z、a-z、0-9共62个字符,另外两个字符取决于实现方式。
根据我的了解,现在没有任何实现会将空格作为一个字符。主要原因是可读性——即Base64字符串必须易于打印和识别。
您可能会在维基百科上找到更多相关信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接