为啥 Javascript `atob()` 和 `btoa()` 被这样命名?

Posted

技术标签:

【中文标题】为啥 Javascript `atob()` 和 `btoa()` 被这样命名?【英文标题】:Why were Javascript `atob()` and `btoa()` named like that?为什么 Javascript `atob()` 和 `btoa()` 被这样命名? 【发布时间】:2016-02-24 13:25:33 【问题描述】:

javascript 中,window.atob() 方法解码 base64 字符串,window.btoa() 方法将 string 编码为 base64

那为什么不把它们命名为base64Decode()base64Encode()atob()btoa() 没有意义,因为它们根本没有语义。

我想知道原因。

【问题讨论】:

@Ryan 我知道它是“a to b”和“b to a”,但我仍然将它们发音为“a-tob”和“b-toa”。 bad name,通常他们使用清晰的长名称,如getElementByIdaddEventListener 我也确信 atob 和 btoa 是反向命名的,A 是原始字符串,B 是编码字符串,这是一个不幸的巧合,Base64 与编码字符串 B 共享首字母。令人困惑的是,我是在过去十年才开始使用 Linux 的,Linux 提供了 base64 程序,所以我从来不必知道 btoa 也这样做。我几乎不会质疑命名选择,但多年后我只需要知道。 你可以去功能 abes46neoced(a)return swab(swab(atob(a))));但您需要编写自己的 swab 函数。 这是因为 atob 中的 'b' 代表二进制,而不是 base64。 ASCII 是 base64 编码的,字符串是二进制的。 【参考方案1】:

atob()btoa() 方法允许作者将内容与 base64 编码进行转换。

在这些 API 中,出于助记目的,“b”可以被认为是 代表“二进制”,“a”代表“ASCII”。但在实践中,对于 主要是历史原因,这些输入和输出 函数是 Unicode 字符串。

发件人:http://www.w3.org/TR/html/webappapis.html#atob

【讨论】:

但它是落后的。 atob() 将二进制转换为 ASCII,btoa() 将 ASCII 转换为二进制。 ascii 是 base64,atob 是 ascii 到二进制。他们有点把这个排除在两个答案之外。所以它不会颠倒 所以StringBinary?!我一直认为,二进制类似于 0 和 1。这太混乱了! @StefanRein 我同意你的意见。 window.btoa 将其参数读取为 二进制数据 并将其拆分为 6 位块以便对其进行编码;这是真的,所以从某种角度来看,命名是有道理的。然而,window.btoa 也只接受一个 string 作为它的参数! :( @K._ > "不过,window.btoa 也只接受一个 字符串 作为它的参数!" btoa 的主要优点是它不关心字符串的格式,它只是将其视为二进制。只是偶然的是,在大多数情况下,该字符串恰好是常规字符串。【参考方案2】:

我知道这是旧的,但它最近出现在 Twitter 上,我想我会分享它,因为它是权威的。

我:

@BrendanEich 你选了这些名字吗?

他:

旧的 Unix 名称,很难找到手册页 rn 但请参阅 https://www.unix.com/man-page/minix/1/btoa/ ....继承的名字 从 Unix 到 Netscape 代码库。我将它们反映到 JS 中 1995年大快人心(五月十天过后不久)。

如果 Minix 链接断开,这里是手册页内容:

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).

来源:Brendan Eich,JavaScript 的创造者。 https://twitter.com/BrendanEich/status/998618208725684224

【讨论】:

嗯,这是对 OP 问题的实际答案。【参考方案3】:

总结已经给出的答案:

atob 代表ASCII to binary 例如:atob("ZXhhbXBsZSELCg==") == "example!^K" btoa 代表binary to ASCII 例如:btoa("\x01\x02\xfe\xff") == "AQL+/w=="

为什么选择 ASCII 和 binary:

ASCIIa)是base64 编码的结果。 安全文本,仅由可正确表示和传输的 ascii 字符 (*) 子集组成(例如电子邮件正文), binaryb)是 0s1s 的任意流(在 javascript 中它必须用字符串类型表示)。

(*) in base64 这些仅限于:A-Za-z0-9+/=(填充,仅在末尾)https://en.wikipedia.org/wiki/Base64

附:我必须承认我自己最初对命名感到困惑,并认为名称被交换了。我认为b 代表 "base64 编码字符串"a 代表 "any 字符串" :D.

【讨论】:

我认为你基本上只是证明了每个人的观点:base64 是 ASCII 的 子集,因此虽然你可能会争辩 btoa 的输出在技术上仍然是 ASCII,但有 没有名称 atob 的理由,它只接受 base64 作为输入。 它有助于思考和记住 'a'(ascii) 作为 base64 输出和 'b'(binary) 作为 0 和 1 的流,即字符串。【参考方案4】:

名称来自具有类似功能的unix function,但您已经可以在此处的其他答案中阅读。


这是我的要记住的助记符使用哪一个。这并不能真正回答问题本身,但可能会帮助人们确定要使用哪个函数,而无需整天在堆栈溢出时打开该问题的选项卡。

美丽到可怕btoa

获取美丽的东西(也就是对您的应用程序有意义的美丽内容:json、xml、文本、二进制数据)并将其转换为无法按原样理解的糟糕的东西(又名:编码)。

可怕到美丽atob

与btoa完全相反

注意

可能有人会说二进制不漂亮,但是嘿,这只是帮助你的一个技巧。

【讨论】:

【参考方案5】:

目前我无法找到来源,但众所周知,在这种情况下,b 代表“二进制”,a 代表“ASCII”。

因此,函数实际上是命名的:

atob() 的 ASCII 到二进制,以及 btoa() 的二进制到 ASCII。

请注意,这是浏览器实现,保留用于遗留/向后兼容的目的。例如,在 Node.js 中,这些不存在。

【讨论】:

在 Node 中你使用 Buffer.from("Hello World").toString('base64') & Buffer.from("SGVsbG8gV29ybGQ=", 'base64').toString('ascii')

以上是关于为啥 Javascript `atob()` 和 `btoa()` 被这样命名?的主要内容,如果未能解决你的问题,请参考以下文章

javascript 使用btoa和atob来进行Base64转码和解码

javascript 使用btoa和atob来进行Base64转码和解码

使用Javascript的atob解码base64不能正确解码utf-8字符串

JavaScript atob 与 Notepad++ Base64 解码不同

Javascript中Base64编码解码的使用实例

js btoa 和 atob