window.atob()
方法解码一个base64字符串,window.btoa()
方法将一个string
编码成base64格式。为什么它们没有像base64Decode()
和base64Encode()
这样的名称呢?atob()
和btoa()
并不合理,因为它们毫无语义。我想知道原因。window.atob()
方法解码一个base64字符串,window.btoa()
方法将一个string
编码成base64格式。为什么它们没有像base64Decode()
和base64Encode()
这样的名称呢?atob()
和btoa()
并不合理,因为它们毫无语义。我想知道原因。我在Twitter上向JavaScript的创造者Brendan Eich询问了这些名字是否由他选定,他回答道:
这些都是Unix旧版中的名称,虽然man页面很难找到,但可以参考https://www.unix.com/man-page/minix/1/btoa/。这些名称从Unix延续到了Netscape的代码库中,1995年(十天五月之后)我匆匆将它们反映到了JS中。
万一Minix链接失效,这里有man页面的内容:
BTOA(1) BTOA(1)
NAME
btoa - binary to ascii conversion
SYNOPSIS
btoa [-adhor] [infile] [outfile]
OPTIONS
-a Decode, rather than encode, the file
-d Extracts repair file from diagnosis file
-h Help menu is displayed giving the options
-o The obsolete algorithm is used for backward compatibility
-r Repair a damaged file
EXAMPLES
btoa <a.out >a.btoa # Convert a.out to ASCII
btoa -a <a.btoa >a.out
# Reverse the above
DESCRIPTION
Btoa is a filter that converts a binary file to ascii for transmission over a telephone
line. If two file names are provided, the first in used for input and the second for out-
put. If only one is provided, it is used as the input file. The program is a function-
ally similar alternative to uue/uud, but the encoding is completely different. Since both
of these are widely used, both have been provided with MINIX. The file is expanded about
25 percent in the process.
SEE ALSO
uue(1), uud(1).
atob()
和btoa()
方法允许作者将内容转换为base64编码并从中恢复。
在这些API中,出于记忆的目的,“b”可以被认为代表“二进制(binary)”,“a”代表“ASCII”。但实际上,基于主要历史原因,这些函数的输入和输出都是Unicode字符串。
atob()
将二进制转换为ASCII码,而btoa()
则将ASCII码转换为二进制。 - 2540625atob
是 ASCII 到二进制的转换。两个回答中都没提到这一点。因此这不是一个反向转换。 - AKnoxString
是二进制的?我一直认为二进制只有0和1,这太令人困惑了! - Stefan Reinwindow.btoa
会将其参数作为二进制数据读取,并将其分成6位一组的块以进行编码;从某种角度来看,这个命名是有道理的。然而,window.btoa
只接受一个字符串作为其参数!:( - Константин Ванwindow.btoa
只接受一个字符串作为参数!” 这是正确的,但这里的字符串只是数据的表示。就像在记事本中打开图像时会显示为字符串,但它仍然是二进制数据。 btoa
的主要优势在于它不关心字符串的格式,它将其视为二进制数据。仅仅巧合的是,在大多数情况下,该字符串恰好是一个常规字符串。 - laggingreflex总结已经给出的答案:
atob
代表ASCII转二进制
atob("ZXhhbXBsZSELCg==") == "example!^K"
btoa
代表二进制转ASCII
btoa("\x01\x02\xfe\xff") == "AQL+/w=="
为什么使用ASCII和binary:
ASCII
(a
)是base64
编码的结果。这是一个由ASCII字符(*)子集组成的安全文本,可以正确表示和传输(例如,电子邮件的正文),binary
(b
)是任何一串0和1(在JavaScript中必须用字符串类型表示)。(*) 在base64
中限制为:A-Z
, a-z
, 0-9
, +
, /
和 =
(填充,仅在末尾) https://en.wikipedia.org/wiki/Base64
P.S. 我必须承认,最初我自己也对命名感到困惑,并认为名称被交换了。我以为b
代表"base64编码的字符串",a
代表"任何字符串" :D。
btoa
的输出仍然在技术上是ASCII,但没有理由将只接受base64作为输入的函数命名为atob
。 - devios1这些名字来自于一个类似功能的unix函数btoa,但您可以在其他答案中已经看到它了。
下面是一个助记口诀,帮助你记住该使用哪个函数。这并没有真正回答问题本身,但可能有助于人们弄清楚哪个函数适合使用,而不必整天都在stackoverflow上保持此问题的标签打开。
btoa
将美丽的东西(例如:应用程序可以理解的美好内容,如json、xml、文本、二进制数据)转换成难以理解的丑陋之物(即进行编码)。
atob
与btoa完全相反。
有些人可能会说二进制数据不够美丽,但是嘿,这只是一个助记技巧来帮助您。
目前我还无法找到来源,但众所周知,在这种情况下,b代表“二进制”,a代表“ASCII”。
因此,实际上函数的名称是:
ASCII转二进制用于atob()
,而
二进制转ASCII用于btoa()
。
请注意,这是浏览器实现,仅为了保留遗留代码和向后兼容。例如,在Node.js中,这些函数不存在。
Buffer.from("Hello World").toString('base64')
和 Buffer.from("SGVsbG8gV29ybGQ=", 'base64').toString('ascii')
。 - Nanoo
atob
中的 'b' 代表二进制,而不是 base64。ASCII 是base64编码的,而字符串是二进制的。 - Janac Meena