1

官方 base64 的填充字符是 '=',在 URL 中使用时可能需要进行百分比编码。我正在尝试找到最好的填充字符,以便我的编码字符串既可以是 url 安全的(我将使用编码的字符串作为参数值,例如 id=encodedString)和文件名安全的(我将使用编码的字符串直接作为文件名)。

点 ('.') 是一个受欢迎的候选者,它是 url 安全的,但它并不完全是文件名安全的:Windows 不允许文件名以尾随 dot 结尾

'!' 似乎是一个可行的选择,虽然我用谷歌搜索过,我从未见过有人将它用作填充字符。有任何想法吗?谢谢!

更新:我已经在我的自定义 base64 编码中将“+”替换为“-”(减号)并将“/”替换为“_”(下划线),因此“-”或“_”不再可用于填充字符.

4

4 回答 4

4

最好的解决方案(我上个月在一个电子邮件发送网站上解决了这个问题)是根本不使用填充字符 (=)

存在填充字符的唯一原因是因为“懒惰”的解码器。您可以非常轻松地添加缺少的 = -> 只需在文本上执行 %4 并从 4 中减去您得到的数字,这就是您需要在字符串结尾添加多少 =。这是C#代码:

    var pad = 4 - (text.Length % 4);
    if (pad < 4)
        text = text.PadRight(text.Length + pad, '=');

此外,大多数这样做的人都对用其他 URL 安全字符替换 + 和 / 感兴趣......我建议:

  • 替换为 - / 替换为 _

不使用 。因为它会在不同的系统/Web 服务器上产生疯狂的结果(例如,在 IIS Base64 编码的字符串不能以 . 结尾或 IIS 将搜索文件)

于 2012-06-01T22:41:41.423 回答
2

URI 中的RFC 2396未保留字符是:

"-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"

不过,值得指出的是,微软的文章还说“不要假设区分大小写”。也许你应该坚持以 16 或 32 为基数?

于 2009-03-18T19:26:28.200 回答
1

维基百科文章指出;

存在用于 URL 变体的修改后的 Base64,其中不会使用填充“=”

于 2010-12-06T14:54:06.587 回答
0

我会选择 '-' 或 '_'
它们是 URL 和文件安全的,它们看起来或多或少像填充

于 2009-03-18T19:22:36.870 回答