为什么Javascript`atob()`和`btoa()`这样命名?

Кон*_*Ван 231 javascript

在Javascript中,window.atob()方法解码base64字符串,window.btoa()方法编码stringbase64.

那么,为什么没有他们命名为喜欢的base64Decode()base64Encode()atob()而且btoa()没有意义,因为它们根本就不是语义.

我想知道原因.

she*_*hen 144

atob()btoa()方法允许作者进行改造的内容,并从base64编码.

在这些API中,出于助记的目的,"b"可以被认为代表"二进制",而"a"代表"ASCII".但实际上,由于主要的历史原因,这些函数的输入和输出都是Unicode字符串.

来自:http://www.w3.org/TR/html/webappapis.html#atob

  • 但它落后了.`atob()`将二进制转换为ASCII,`btoa()`将ASCII转换为二进制. (67认同)
  • ascii是base64,`atob`是ascii到binary.他们从两个答案中都留下了这个.所以它没有逆转 (44认同)
  • 所以`String`是`Binary` ?! 我一直以为,二进制就像0和1这样.这太令人困惑了! (7认同)
  • @StefanRein我同意你的意见.`window.btoa`将其参数读为**二进制数据**并将其拆分为6位块以对其进行编码; 这是真的,所以命名在一个观点上是有道理的.但是,`window.btoa`也只需要**字符串**作为参数!:( (5认同)
  • @ K._>"但是,同样,`window.btoa`只需要一个**字符串**作为其参数!" <这是真的,但这里的字符串只是数据的表示.就像你试图在记事本中打开一个图像一样,它会显示为一个字符串,但它仍然是二进制数据.`btoa`的主要优点是它不关心字符串的格式,它只是将其视为二进制.在大多数情况下,字符串恰好是常规字符串,这是偶然的. (5认同)
  • 这是一种典型的Javascript方法.甚至用这种语言打破了助记符. (3认同)
  • 不,它是浏览器/网络标准 API,而不是 JavaScript。Node.js 通过 `Buffer` 拥有更好的 API 和一流的二进制支持,例如 `buffer.toString('base64')` 和 `Buffer.from(base64string, 'base64')` (3认同)
  • 这,以及遵循 C 传统,如 `atoi()` 等。 (2认同)
  • @StefanRein @AKnox 不仅`String` 是`Binary`,还有`jpg`、`mp4`、`avi`、`gif`……任何二进制文件都可以编码成base64 ASCII 数组。 (2认同)
  • 我想我们都同意这些是标准中最糟糕的命名功能.对于我的大脑,"b"必须是base64的缩写,"a"必须是ASCII的缩写,但它与*完全相反*.我只是......为什么? (2认同)
  • “二进制”并不意味着普通的文本字符串,而是实际的 blob 数据 - 想想图像或文档文件。我猜想它用于文本字符串是因为需要安全地存储 Web 表单数据,而不会受到代码注入的威胁或某些类似的原因。 (2认同)
  • @jtheletter 这并不落后,尽管我同意这很令人困惑。“二进制”输入是指二进制数据的_字符串表示_,其中每个字符都被解释为一个字节(因此不允许高于“0xff”的代码点)。并非所有该范围都符合 ASCII(例如,`btoa('ð\x9f\x92©')` 不会抛出异常,即使这些字符都不是 ASCII)。同时,“ASCII”指的是 Base64 ,符合 ASCII。我同意这是一个可怕的命名系统。 (2认同)

der*_*nio 91

总结已经给出的答案:

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

为什么一个 SCII和b inary:

  • ASCII(a)是base64编码的结果.一个安全的唯一的ASCII字符的一个子集(*),可以正确表示和运输组成的文本(例如电子邮件的身体),
  • binary(b)是01的任何流(在javascript中它必须用字符串类型表示).

(*)在base64这些被限制为:A-Z,a-z,0-9,+,/=(填充,仅在端部)https://en.wikipedia.org/wiki/Base64

PS我必须承认我自己最初被命名混淆,并认为名称被交换.我认为b立场" b ase64编码字符串",并a" 一个纽约字符串":d.

  • 我认为你基本上只是证明了每个人的观点:base64是ASCII的*子集*因此,虽然你可能会认为`btoa`的输出仍然是技术上的ASCII,但是'**atob`的名称没有**理由接受base64作为输入. (5认同)
  • 它有助于思考和记住“a”(ascii)作为base64输出,“b”(二进制)作为0和1的字符串流。 (4认同)

Wil*_*ton 68

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

我:

@BrendanEich你选这些名字了吗?

他:

旧的Unix名称,很难找到手册页,但请参阅 https://www.unix.com/man-page/minix/1/btoa/ .... 名称从Unix转移到Netscape代码库.我在1995年匆忙地将它们反映到JS中(在五月的十天之后但很快).

如果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).
Run Code Online (Sandbox Code Playgroud)

资料来源:JavaScript的创建者Brendan Eich.https://twitter.com/BrendanEich/status/998618208725684224

  • 好吧,这是对OP问题的实际答案。 (4认同)

Lun*_*fel 32

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


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

美丽到可怕 btoa

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

美得可怕 atob

与 btoa 完全相反

笔记

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


Sel*_*ish 5

我目前无法找到一个来源,但众所周知,在这种情况下,b代表'二进制',而a代表'ASCII'.

因此,这些函数实际命名为:

ASCII到二进制atob(),二进制到ASCII btoa().

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

  • 在 Node 中,您使用 `Buffer.from("Hello World").toString('base64')` 和 `Buffer.from("SGVsbG8gV29ybGQ=", 'base64').toString('ascii')` (4认同)