Pourquoi est-ce que seule base64 au lieu de base128 est utilisée pour transmettre des données binaires sur le Web? Le jeu de caractères ASCII a 128 caractères qui en théorie pourraient représenter la base 128, mais seule base64 mais pas base128 est utilisée dans la plupart des cas.
encoding
language-agnostic
binary
Gmadar
la source
la source
Réponses:
Le problème est qu'au moins 32 caractères du jeu de caractères ASCII sont des «caractères de contrôle» qui peuvent être interprétés par le terminal récepteur. Par exemple, il y a le caractère BEL (cloche) qui fait sonner le terminal récepteur. Il y a les caractères SOT (Start Of Transmission) et EOT (End Of Transmission) qui exécutent exactement ce que leurs noms impliquent. Et n'oubliez pas les caractères CR et LF, qui peuvent avoir des significations spéciales dans la façon dont les structures de données sont sérialisées / aplaties dans un flux.
Adobe a créé le codage Base85 pour utiliser plus de caractères dans le jeu de caractères ASCII, mais AFAIK est protégé par des brevets.
la source
btoa
, qui date de 1990, n'est pas grevé de brevets, et ceux-ci seraient certainement expirés de toute façon.Parce que certains de ces 128 caractères ne sont pas imprimables (principalement ceux qui sont sous le point de code 0x20). Par conséquent, ils ne peuvent pas être transmis de manière fiable sous forme de chaîne sur le fil. Et, si vous dépassez le point de code 128, vous pouvez avoir des problèmes d'encodage en raison des différents encodages utilisés dans les systèmes.
la source
Comme déjà indiqué dans les autres réponses, le point clé est de réduire le jeu de caractères aux caractères imprimables . Un schéma de codage plus efficace est basE91 car il utilise un jeu de caractères plus grand et évite toujours les caractères de contrôle / d'espacement dans la plage ASCII basse. La page Web contient une belle comparaison de l' efficacité de l'encodage binaire vs base64 vs basE91 .
Une fois, j'ai nettoyé l'implémentation Java. Si les gens sont intéressés, je pourrais le pousser sur GitHub.
Mise à jour : il est maintenant sur GitHub .
la source
Que les 32 premiers caractères soient des caractères de contrôle n'a absolument aucune pertinence, car vous n'avez pas à les utiliser pour obtenir 128 caractères. Nous avons le choix entre 256 caractères et seuls les 32 premiers sont des caractères de contrôle. Cela laisse 192 caractères, et donc 128 est tout à fait possible sans utiliser de caractères de contrôle.
Voici la raison: ce doit être quelque chose qui aura la même apparence et que vous pouvez copier et coller, peu importe où. Pour cela, il doit y avoir des caractères qui seront affichés de la même manière sur n'importe quel forum, chat, e-mail, etc. Cela signifie que nous ne pouvons pas utiliser de caractères, qu'un client de forum / chat / e-mail peut généralement utiliser pour le formatage ou le non-respect. Il doit également s'agir de caractères identiques, quels que soient la police, la langue et les paramètres régionaux.
C'est la raison!
la source
Base64 est courant car il résout une variété de problèmes (fonctionne presque partout où vous pouvez penser)
Vous n'avez pas à vous soucier de savoir si le transport est propre 8 bits ou non.
Tous les caractères de l'encodage sont imprimables. Vous pouvez les voir . Vous pouvez les copier et les coller . Vous pouvez les utiliser dans des URL (variantes particulières). etc.
Taille d'encodage fixe. Vous savez que les
m
octets peuvent toujours encoder enn
octets.Tout le monde en a entendu parler - il est largement pris en charge, de nombreuses bibliothèques, si faciles à interagir.
Base128 n'a pas tous ces avantages.
Il semble que ce soit 8 bits propre - mais rappelez-vous que base64 utilise 65 symboles. Sans un caractère hors bande, vous ne pouvez pas bénéficier d'une taille d'encodage fixe. Si vous utilisez un caractère hors bande, vous ne pouvez plus être propre 8 bits.
Ce n'est pas tout négatif cependant.
base128 est plus facile à encoder / décoder que base64 - il vous suffit d'utiliser des décalages et des masques. Peut être important pour les implémentations intégrées
base128 fait une utilisation légèrement plus efficace du transport que base64 en utilisant plus de bits disponibles.
Les gens font usage base128 - Je l' utilise pour quelque chose maintenant. Ce n'est tout simplement pas aussi courant.
la source
CODES
variable.Pas sûr, mais je pense que les valeurs inférieures (représentant des codes de contrôle ou quelque chose) ne sont pas transférées de manière fiable en tant que texte / caractères dans les requêtes / réponses HTTP, et les valeurs supérieures à 127 peuvent être locales / codepage / tout ce qui est spécifique, donc il n'y en a pas 128 caractères différents susceptibles de fonctionner sur tous les navigateurs / plates-formes.
la source
esaji a raison. Base64 est utilisé pour encoder des données binaires pour la transmission à l'aide d'un protocole qui n'attend que du texte. C'est juste dans l' entrée Wiki .
la source
Découvrez la classe PHP base128. Encodage et décodage avec le jeu de caractères ISO 8859-1.
GoogleCode Classe PHP Base128
la source