Pourquoi Javascript `atob ()` et `btoa ()` ont-ils été nommés ainsi?


266

En Javascript, window.atob()méthode décode une base64 chaîne et window.btoa()méthode code pour une stringen base64 .

Alors pourquoi n'ont-ils pas été nommés comme base64Decode()et base64Encode()? atob()et btoa()n'ont pas de sens car ils ne sont pas du tout sémantiques.

Je veux connaître la raison.


153
Cela m'a pris des années pour réaliser que c'était "A to B". Je les avais prononcés "a-tob" et "b-toa" pendant tout ce temps.
Ryan

5
@Ryan, je suis content que ce ne soit pas seulement moi!
TMH

1
Comptez sur moi. Je pensais la même chose :-)
Super Coder

3
Retirez votre ego de ma nomenclature.
AJB

1
mauvais name, généralement ils utilisent un nom long clair comme getElementById,addEventListener
cieunteung

Réponses:


164

Les méthodes atob()et btoa()permettent aux auteurs de transformer le contenu vers et depuis l'encodage base64.

Dans ces API, à des fins mnémotechniques, le "b" peut être considéré comme signifiant "binaire" et le "a" pour "ASCII". En pratique, cependant, pour des raisons principalement historiques, l'entrée et la sortie de ces fonctions sont des chaînes Unicode.

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


82
Mais c'est en arrière. atob()convertit le binaire en ASCII et btoa()convertit l'ASCII en binaire.
2540625

52
ascii est base64, et atobest ascii en binaire. ils ont en quelque sorte omis cela des deux réponses. donc ce n'est pas inversé
AKnox

13
Alors Stringc'est ça Binary?! Et je pensais tout le temps, le binaire était quelque chose comme 0 et 1. C'est tellement confus!
Stefan Rein

6
@StefanRein Je partage votre avis. window.btoalire son argument sous forme de données binaires et le diviser en 6 bits de morceaux afin de le coder; c'est vrai, donc la dénomination a du sens d'un point de vue. Cependant, aussi, window.btoaprend seulement une chaîne comme argument! :(
Константин Ван

5
@ K._> "Cependant, window.btoane prend également qu'une chaîne comme argument!" <C'est vrai, mais la chaîne ici n'est qu'une représentation des données. Comme si vous essayez d'ouvrir une image dans un bloc-notes, elle s'affichera sous forme de chaîne, mais il s'agit toujours de données binaires. btoaLe principal avantage de l 'est qu'il ne se soucie pas du format de la chaîne, il la traite simplement comme binaire. Ce n'est qu'accessoire que dans la plupart des cas, cette chaîne se trouve être une chaîne régulière.
laggingreflex

106

Pour résumer les réponses déjà données:

  • atob signifie ASCII to binary
    • par exemple: atob("ZXhhbXBsZSELCg==") == "example!^K"
  • btoa signifie binary to ASCII
    • par exemple: btoa("\x01\x02\xfe\xff") == "AQL+/w=="

Pourquoi A SCII et b inaire:

  • ASCII(le a) est le résultat de l' base64encodage. UNE coffre-fort texte composé uniquement d'un sous-ensemble de caractères ascii (*) pouvant être correctement représenté et transporté (par exemple le corps de l'e-mail),
  • binary(le b) est un flux de 0 et de 1 (en javascript, il doit être représenté par un type de chaîne).

(*) Dans base64ceux - ci sont limités à: A-Z, a-z, 0-9, +, /et =(remplissage, seulement à la fin) https://en.wikipedia.org/wiki/Base64

PS Je dois admettre que j'ai moi-même été au début dérouté par la dénomination et pensé que les noms ont été échangés. Je pensais que bsupport pour « b ase64 chaîne encodée » et apour « une chaîne ny » : D.


7
Je pense que vous venez de prouver le point de vue de tout le monde: base64 est un sous - ensemble d'ASCII, donc bien que vous puissiez affirmer que la sortie de btoaest toujours techniquement ASCII, il n'y a aucune justification pour le nom atobqui n'accepte que base64 comme entrée.
devios1

1
Cela aide à penser et à se souvenir de 'a' (ascii) comme sortie base64 et 'b' (binaire) comme flux de 0 et 1 qui est une chaîne.
Talespin_Kit

86

Je sais que c'est vieux, mais il est récemment apparu sur Twitter, et j'ai pensé le partager car il fait autorité.

Moi:

@BrendanEich avez-vous choisi ces noms?

Lui:

Anciens noms Unix, difficile de trouver les pages de manuel rn mais voir https://www.unix.com/man-page/minix/1/btoa/… . Les noms transférés d'Unix dans la base de code Netscape. Je les ai reflétés dans JS à la hâte en 1995 (après les dix jours de mai mais bientôt).

En cas de rupture du lien Minix, voici le contenu de la page de manuel:

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

Source: Brendan Eich, le créateur de JavaScript. https://twitter.com/BrendanEich/status/998618208725684224


5
Eh bien, c'est la vraie réponse à la question d'OP.
Ivan Filho

6

Je ne peux pas localiser une source pour le moment, mais il est de notoriété publique que dans ce cas, le b signifie «binaire» et le a pour «ASCII».

Par conséquent, les fonctions sont en fait nommées:

ASCII en binaire pour atob()et binaire en ASCII pour btoa().

Notez qu'il s'agit d'une implémentation de navigateur, et a été laissé à des fins de compatibilité héritée / rétrocompatible. Dans Node.js par exemple, ceux-ci n'existent pas.


Dans Node, vous utilisez Buffer.from("Hello World").toString('base64')&Buffer.from("SGVsbG8gV29ybGQ=", 'base64').toString('ascii')
Nanoo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.