url-Encode 和 Base64 编码 (用途) 的区别是什么?

28

我在想...

(除了在查询字符串中使用base64加号“+”的问题 - 它被转换为“空格”,可以通过 %2b 来解决) :--->在查询字符串中传输数据的首选方法是什么?

这两个功能都可以通过JS命令使用:

  • btoa
  • encodeUriComponent

所以我在自问(也在问你):

何时应该使用哪个? (我一直凭直觉使用 encodeUriCompoonent )。

问题在于它们的定义不同,但实现方式可以相似......

编辑

我认为我已经找到了提出问题的原因....(以及为什么之前没有人问)

enter image description here

4个回答

18

base64 用于传输二进制数据。(不支持IE,无法对特殊字符进行编码。)

encodeURIComponent 只会对特殊字符进行编码。

有趣的是,你不能将base64应用于Unicode字符串而不使用encodeURIComponent: https://developer.mozilla.org/en/DOM/window.btoa


我可以使用 base64 来传输 userid=1,也可以使用 encodeURIComponent ... 我正在寻找它们之间的区别。 - Royi Namir
那么其实没有什么区别。但是如果您传输Unicode数据,则必须使用encodeURIComponent。而且与encodeURIComponent相比,base64将占用更多的空间。 - meze
1
如果您只传递不需要编码的字符(即大多数是字母数字字符),encodeURIComponent()将只占用较少的空间 - 任何实际编码的内容将比base64占用更多的空间。例如,btoa('::') 变成 Ojo=,而 encodeURIComponent('::') 变成 %3A%3A - 并且随着字符计数的增加而急剧上升。 - lucideer
1
@lucideer 无论如何,比 btoa('::') 更通用的是需要执行 'btoa(encodeURIComponent(realWorldString))',否则 btoa 将无法工作。您所描述的情况是输入到 '::' 的内容甚至没有一个字符在纯 ASCII 之外。即使是 U+0100 也会出问题。一旦您需要编码(即超过 ASCII),您仍然需要使用 encodeURIComponent,并且大小会相加,比较就没有太多意义了。 - humanityANDpeace
你的链接已失效。 - Woody
显示剩余2条评论

3
这完全取决于您的服务器端应用程序。
客户端不会将'+'翻译为'space' - 一些服务器端应用程序会自动将其转换为'space',主要是为了向后兼容(相反,一些服务器端应用程序会将'+'保留为'+'以符合RFC3986)。
就客户端而言 - btoa()encodeURIComponent()(以及encodeURI()escape())只是根据不同的编码或转义算法将文本字符串编码为不同的抽象字符串 - btoa()通常使用base64编码生成最小的结果字符串,但meze's comment关于unicode值得在此考虑。
重要的是要注意你的服务器端应用程序(在你的情况下可能是基于ASP.NET的设置)使用什么来将这个字符串解码回它的原始形式。

考虑到无论如何都需要使用encodeURIComponent()来处理Unicode字符> U+00FF,因此btoa()的使用情况以及建议的优势——更小的大小,非常有限。 - humanityANDpeace

0

当我想将字节数组转换为字符串并能够稍后将其转换回字节数组时,我使用Base64编码。

当我想要在URL中安全地放置字符串时,我使用UrlEncoding。


-1

就我而言,每当我想在服务器和客户端之间传输任何可以是Unicode的内容时,我都会使用Base64。urlencode 不能很好地处理所有Unicode字符,百分号符号很快就会变成一团糟。

所以,简而言之:如果需要输入/输出Unicode,请始终将其转换为Base64进行传输。


我刚看到了用户meze的另一个答案。我不知道他在说什么。我之所以使用base64编码,正是因为它能够很好地处理Unicode字符串。我的一些网站每天都会有日语、中文和西里尔字母的输入,而这种编码方式可以很好地传输它们。 - Adergaard
1
Base64 只能使用 ASCII,而 encodeURIComponent 可以使用 Unicode。在你的浏览器中尝试一下:window.btoa('✓ à la mode'); - meze
1
啊哈,好吧,我不知道btoa是做什么的。当我谈到base64时,我指的是一般的东西。我自己使用PHP将其用于向客户端发送内容。 - Adergaard

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