Charger un fichier
  1. base64hub
  2. Autres bases
  3. Base91

Encodeur et décodeur Base91 (basE91)

Saisissez du texte pour obtenir du basE91, l’encodage qui range des données binaires dans 91 caractères ASCII imprimables. Sur des données aléatoires, il est environ 8 % plus court que le Base64, au prix d’un alphabet moins commode.

Gratuit sans inscription, sans limites Local rien n'est envoyé ~23 % de surcoût sur des données aléatoires Mis à jour 27 oct. 2026
Entrée 0Octets 0 BSortie 0

Traité dans votre navigateur. Cette page ne peut envoyer vos données nulle part – comment le savons-nous

Comment encoder et décoder du Base91

  1. Saisissez ou collez du texte dans Entrée · Texte. La chaîne encodée apparaît dans Sortie · basE91.
  2. Pour des données binaires, réglez De sur Hex ou Base64 et collez-les sous cette forme.
  3. Pour décoder, cliquez sur basE91 → Texte dans le sélecteur de sens. Les sauts de ligne de l’entrée sont ignorés ; tout autre caractère hors de l’alphabet arrête le décodage en indiquant sa position.
  4. Copier la sortie ou Télécharger le résultat. Pour des données binaires décodées, utilisez Enregistrer les octets.

Comment fonctionne le basE91

Le basE91 a été publié par Joachim Henke. Le Base64 associe chaque groupe de 6 bits à un caractère. Le basE91, lui, accumule les bits d’entrée dans une file et en prend 13 à la fois. Deux caractères peuvent représenter 91 × 91 = 8281 valeurs, un peu plus que les 8192 dont 13 bits ont besoin. La marge sert à une optimisation : quand les 13 bits suivants valent 88 ou moins, l’encodeur prend 14 bits à la place, et écrit toujours deux caractères.

La longueur de la sortie dépend donc du contenu. Sur des données aléatoires, les groupes de 14 bits sont rares (moins de 1,1 % des groupes) : le surcoût est proche de 16/13, soit environ 23 %. Les données riches en bits nuls se compactent mieux : 1000 octets nuls s’encodent en 1143 caractères, soit 14 % de surcoût.

EntréebasE91Base64
testfPNKddGVzdA==
Hello>OwJh>ASGVsbG8=
Hello World!>OwJh>Io0Tv!8PESGVsbG8gV29ybGQh
4 octets nulsAAAAAAAAAAA==
1000 octets aléatoiresenviron 1230 caractères1336 caractères

Les groupes variables ont un effet secondaire : il n’y a pas de taille de bloc fixe, on ne peut donc pas décoder à partir du milieu d’une chaîne ni la couper à un endroit arbitraire. Le Base64, lui, peut se couper à n’importe quel multiple de 4 caractères.

L’alphabet et les problèmes qu’il pose

L’alphabet basE91 comprend A–Z, a–z, 0–9 et ces 29 caractères :

!#$%&()*+,./:;<=>?@[]^_`{|}~"

Il exclut l’espace, ', - et \. L’espace et ' posent problème dans les shells et les chaînes entre guillemets, et \ est un caractère d’échappement presque partout. Le guillemet double y figure pourtant, avec <, > et & : le basE91 doit donc être échappé dans du JSON, du HTML ou du XML, et les échappements mangent une partie du gain par rapport au Base64. Il fonctionne le mieux là où tout l’ASCII imprimable est accepté, comme un fichier texte, un argument de shell entre apostrophes ou un champ de protocole qui accepte le binaire.

Un encodeur basE91 en Python

La bibliothèque standard n’a pas de basE91. L’algorithme de Henke est assez court pour être recopié :

ALPHABET = ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
            "0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~\"")

def b91encode(data: bytes) -> str:
    out, queue, nbits = [], 0, 0
    for byte in data:
        queue |= byte << nbits
        nbits += 8
        if nbits > 13:
            value = queue & 8191
            if value > 88:
                queue >>= 13
                nbits -= 13
            else:
                value = queue & 16383
                queue >>= 14
                nbits -= 14
            out += ALPHABET[value % 91], ALPHABET[value // 91]
    if nbits:
        out.append(ALPHABET[queue % 91])
        if nbits > 7 or queue > 90:
            out.append(ALPHABET[queue // 91])
    return "".join(out)

b91encode(b"test")    # 'fPNKd'

Il produit la même sortie que cette page pour n’importe quelle entrée. La page Python en dit plus sur la manipulation des octets en Python.

Quand choisir le Base91

Choisissez le basE91 quand chaque octet de sortie compte et que le canal accepte presque tout l’ASCII imprimable : journaux compacts, ou champs texte à la longueur strictement limitée. Pour tout ce qui va dans du JSON, des URL, du HTML ou des e-mails, le Base64 est plus sûr et presque aussi court, et l’Ascii85 est normalisé dans PDF et PostScript si vous voulez 25 % de surcoût avec des blocs fixes.

FAQ

Quels caractères le Base91 utilise-t-il ?

Les 95 caractères ASCII imprimables, sauf l’espace, l’apostrophe ', le trait d’union - et la barre oblique inverse \. Restent les lettres, les chiffres et 29 signes de ponctuation, dont le guillemet double.

Le Base91 est-il plus compact que le Base85 ?

Un peu. Des données aléatoires grossissent d’environ 23 % en basE91 et d’exactement 25 % en Base85 ; ici, 100 000 octets aléatoires ont donné 122 976 caractères, contre 125 000 en Ascii85. Les données contenant de longues suites d’octets nuls se compriment davantage, jusqu’à environ 14 % de surcoût.

Pourquoi le Base91 n'est-il pas plus répandu ?

Il n’a pas de RFC, sa sortie contient " et d’autres caractères à échapper en JSON, dans les shells et en HTML, et ses groupes de bits variables le rendent plus lent et plus difficile à implémenter que le Base64. Les quelques pourcents gagnés compensent rarement ces défauts.

Puis-je décoder du Base91 écrit par une autre bibliothèque ?

Seulement si elle utilise l’alphabet basE91 de Henke et son ordre des bits, ce qui est le cas de la plupart. Quelques bibliothèques ont leur propre alphabet Base91 ; leur sortie se décode ici sans erreur, mais donne de mauvais octets.