base128が使用されないのはなぜですか?[閉まっている]


90

Webでバイナリデータを送信するためにbase128ではなくbase64のみが使用されるのはなぜですか?ASCII文字セットには128文字があり、理論的にはbase 128を表すことができますが、ほとんどの場合、base128ではなくbase64のみが使用されます。


60
なぜベース256にしないのですか?
ガンボ

22
ポイントは印刷可能な文字を持つことだと思います(ただし64を超えるものもあります...)
Felix Kling

29
ベース128は少し前に私たちに属していたと思います。ガード基地64に割り当てられたチームはまだ頑張っています。
リッチメルトン、

5
なぜこの質問はJavaScript固有のものですか?これは、ウェブで使用されている他のほとんどの言語にも当てはまりますね。
Benedikt Waldvogel、2011年

5
@KenRockot:15ビット文字の一部が3バイトにエンコードされることを認識しています。base-2048エンコーディングは、11ビットを2バイトにパックすることを意味します。これにより、1バイトあたり5.5ビットになります。これは、base-64よりも半ビット少なくなります。
maaartinus 2014年

回答:


105

問題は、ASCII文字セットの少なくとも32文字が「制御文字」であり、受信端末によって解釈される可能性があることです。たとえば、受信端末のチャイムを鳴らすBEL(ベル)文字があります。SOT(送信開始)とEOT(送信終了)の文字があり、それらの名前が示すとおりに機能します。また、CRとLFの文字も忘れないでください。これら、データ構造をシリアル化/ストリームにフラット化する方法で特別な意味を持つ場合があります。

アドビは、ASCII文字セットでより多くの文字を使用するためにBase85エンコーディングを作成しましたが、AFAIKは特許によって保護されています。


7
Base91は優れたオープンソースオプションのようです:base91.sourceforge.net
Jorge Cevallos

2
2の累乗がバイトデータに容易に適合し、エンコーディングがより単純であることを考慮する価値があります。次に、移植性があります。すべての言語には、base64エンコードおよび/またはbase64デコードがあります。
Lodewijk 14

5
Base85とAdobeは:それが付与された特許番号と年を引用した場合の答えは、より便利作ることができます。特許が問題である場合、btoa1990年にさかのぼるが常に特許に拘束されず、それらはとにかく期限切れになるはずです。
agc 2017年

65

これらの128文字の一部は印刷できないためです(主にコードポイント0x20未満の文字)。したがって、それらは確実に回線を介してストリングとして送信できません。また、コードポイント128を超えると、システム間で異なるエンコーディングが使用されるため、エンコーディングの問題が発生する可能性があります。


8
Base94はここgithubに存在し、94のすべての印刷可能なASCII文字を使用します:gist.github.com/iso2022jp/4054241
intrepidis

15

他の回答ですでに述べたように、重要な点は、文字セットを印刷可能な文字セットに減らすことです。basE91は、より大きな文字セットを使用し、低いASCII範囲の制御/空白文字を回避するため、より効率的なエンコードスキームです。Webページには、バイナリとbase64とbasE91のエンコード効率の優れた比較が含まれています。

Java実装を一度クリーンアップしました。人々が興味があれば、GitHubにプッシュすることができます。

更新:現在GitHubにあります


私はJavaバージョンに興味があります
Michael Deardeuff


12

最初の32文字が制御文字であることは、128文字を取得するために使用する必要がないため、まったく関係ありません。256文字から選択でき、最初の32文字だけが制御文字です。これは192文字を残すため、128文字は制御文字を使用しなくても完全に可能です。

その理由は次のとおりです。見た目が同じで、どこにでもコピーして貼り付けることができる必要があります。そのため、フォーラム、チャット、電子メールなどで同じように表示される文字でなければなりません。つまり、私たちは文字を使用できません。フォーラム/チャット/電子メールクライアントは通常、フォーマットや無視に使用できます。また、フォント、言語、地域の設定に関係なく、同じ文字でなければなりません。

それが理由です!


7
制御文字は適切です。なぜなら、ほとんどすべての人が、可能な限りコードページ/エンコーディングに中立であるべきだというあなたの考えをすでに想定していたからです。これにより、関連するエンコーディングのほとんどのサブセットである(7ビット)ASCIIのみに制限されます。また、すべてのインターネットが8ビットでクリーンであるとは限りません。その多くはデファクトASCIIです。あなたのポイントは、作る価値があります。
Tim Seguine 2014年

7
追加するだけ:ASCIIは128文字のみを定義します。文字#128から#255はASCII では定義されていません。質問は「8ビットエンコーディング」ではなく明示的にASCIIを参照しているため、すべての回答はASCIIセットの128文字に制限されます。
pepoluan 2016年

例として最も一般的なUTF-8エンコーディングを使用すると、128〜196バイトのバイトは、すぐにUTF8デコードエラーになります。196から256のバイトは、次のバイトも同じ文字であることを意味しますが、次のバイトが128未満の場合、UTF8デコードエラーが再び発生します。ただし、ほとんどすべての文字エンコードに依存する言語では、base64ライブラリはbase64文字列をUTF8セーフ文字列として取得します。UTF128セーフな文字列としてエンコードできないため、base128でも同じことはできません。
SOFe

10

Base64は、さまざまな問題を解決するため一般的です(考えられるほぼすべての場所で機能します)。

  • トランスポートが8ビットクリーンであるかどうかを心配する必要はありません。

  • エンコーディング内のすべての文字が印刷可能です。あなたはそれらを見ることができます。コピーして貼り付けることができます。URL(特定のバリアント)で使用できます。等

  • 固定エンコードサイズ。mバイトは常にnバイトにエンコードできることがわかっています。

  • 誰もがそれを聞いたことがあります-それは広くサポートされており、多くのライブラリーであり、相互運用が簡単です。

Base128には、これらすべての利点があるわけではありません。

見た目は8ビットのクリーンですが、base64は65個のシンボルを使用していることを思い出してください。帯域外の文字がないと、エンコードサイズが固定されるという利点はありません。帯域外の文字を使用すると、8ビットクリーンにすることができなくなります。

しかし、それはすべて否定的ではありません。

  • base128はbase64よりもエンコード/デコードが簡単です-シフトとマスクを使用するだけです。組み込み実装にとって重要になる可能性があります

  • base128は、利用可能なビットをより多く使用することにより、トランスポートをbase64よりもわずかに効率的に使用します。

人々 base128を使用しています-私は今それを何かのために使用しています。それはそれほど一般的ではありません。


また、メール/ニュースシステムとそれらのilk(およびXML)は常に最初の32コードポイントに適するとは限らない(たとえば、CR LFとLFを比較する)ことを忘れないでください。
SamB 2015年

「そのbase64は65のシンボルを使用しています。」=>タイプミスまたは何かを見逃しましたか?
Kikiwa

@Kikiwa、ウィキペディアでこのJavaサンプルを見てください。CODES変数の長さを確認してください。
John La Rooy、2016年

ああそうです、パディング文字「=」はエンコーディングペイロードの最後にのみあります。そうです、ありがとう。
キキワ2016年

4

確かではありませんが、低い値(制御コードなどを表す)は、HTTP要求/応答内のテキスト/文字として確実に転送されないと思います。127を超える値は、ロケール/コードページ/特定のものである可能性があるため、すべてのブラウザ/プラットフォームで機能することが期待できる128の異なる文字。


3

えさじそうです。Base64は、テキストのみを期待するプロトコルを使用して送信するバイナリデータをエンコードするために使用されます。それはWikiエントリの中にあります。


2

base128 PHPクラスをチェックアウトしてください。ISO 8859-1文字セットによるエンコードとデコード。

GoogleCode PHPクラスBase128


1
代わりにutf-8を使用したい...
Janus Troelsen 2012

1
基本エンコーディングは、基になるデータとは何の関係もありません。テキスト/データをエンコードしたい任意のテキストエンコーディングを使用できます。彼が意味することは、Base ##インデックステーブルは、変換としてISO 8859-1 ASCII文字セットを使用することです。
チャド2014年

1
ベースエンコードされたバイナリデータをテキストに埋め込もうとするとすぐに、基になるデータと何らかの関係があります。そのテキストが別のエンコーディングでエンコードされている場合、問題が発生します。
Stijn de Witt 2017

「ISO 8859-1 ASCII」文字セットなどはありません。プログラムは、128種類の印刷可能なISO 8859-1文字を使用してデータをエンコードします。形や形を問わず、ASCIIを使用しません
NisseEngström17年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.