Base91 エンコーダー・デコーダー

テキスト、16進数のバイト列、ファイルを basE91 に変換し、元に戻します。basE91 はバイナリデータを印字可能な ASCII 文字 91 種に詰め込み、Base64 や Base85 より短い出力を生成します。

すべてブラウザ内で処理され、データはアップロードされません。

使い方

  1. テキストやバイト列を basE91 に変換するには「エンコード」を、basE91 をデータに戻すには「デコード」を選択します。
  2. データを入力または貼り付けるか、ファイルを開きます。生のバイト列を扱う場合は、「入力形式」を「16進数」に切り替えます。
  3. 結果は入力に合わせてリアルタイムに更新されます。デコード時は、「出力形式」で「テキスト」または「16進数」を選択します。
  4. 結果をコピーするか、ファイルとしてダウンロードします。

basE91 とは

basE91 は、Joachim Henke が考案したバイナリ・テキスト変換方式です。印字可能な ASCII 文字 95 種のうち、スペース、アポストロフィ '、ハイフン -、バックスラッシュ \ を除く 91 種を使います。

basE91 は、固定長のバイトブロック単位では処理しません。エンコーダーは入力のビットをバッファーにため、13 ビットずつ取り出します。13 ビットの値が 88 より大きければ、そのまま 2 文字で書き出します。88 以下であれば 14 ビット目も取り出します。91 進数の 2 文字で 91 × 91 = 8281 通りの値を表せるため、それでも収まります。つまり、13 ビットまたは 14 ビットごとに、ちょうど 2 文字になります。

その結果、サイズの増加は最大でも約 23% で、ゼロバイトが長く続くデータでは約 14% まで下がります。ランダムなデータや圧縮済みのデータは、上限に近くなります。

basE91 と他の方式の比較

エンコード方式文字数出力サイズ
16進数16入力の 2 倍
Base5858入力の約 1.37 倍
Base6464入力の 1.33 倍
Base85 / Ascii8585入力の 1.25 倍
basE9191入力の約 1.14~1.23 倍

自分のデータで実際の出力の長さを比べるには、すべてのエンコードに入力してみてください。

注意点

  • エスケープ。アルファベットには、JSON やほとんどの文字列リテラルでエスケープが必要なダブルクォート " と、HTML や XML でエスケープが必要な <、>、& が含まれます。basE91 は URL セーフではありません。
  • 文字列全体をデコードする。ビットが文字の境界をまたいで続くため、basE91 文字列の途中から切り出した部分だけをデコードすることはできません。
  • 対応状況。basE91 は IETF の標準ではありません。作者が C などの言語でリファレンス実装を公開しており、Python 向けの base91 パッケージなど、ほとんどのプラットフォームに移植版があります。

仕様

使用文字印字可能な ASCII 文字 91 種
出力サイズ約 123%
パディングなし
規格basE91(Joachim Henke)
大文字と小文字の区別あり

エンコード例

入力 (UTF-8)出力
Hello, World!>OwJh>}AQ;r@@Y?F
Base64.isxD7gXm^?t#5
你好I_5k7aPE

よくある質問

basE91 は Base64 より小さくなりますか?

はい。Base64 では常に 33% 増えますが、basE91 の増加は最大でも約 23% で、ゼロバイトの多いデータではさらに少なくなります。1 MB のファイルなら、約 100 KB の節約になります。

basE91 ではどの文字を使いますか?
英字 A-Z と a-z、数字 0-9、記号 !#$%&()*+,./:;<=>?@[]^_`{|}~" です。スペース、アポストロフィ、ハイフン、バックスラッシュは使いません。
なぜ basE91 と表記するのですか?

作者がそのように表記しているためです。basE91 と Base91 は同じエンコード方式を指し、このページは元のアルゴリズムに従っています。

空白文字があるとデコードに失敗しますか?

いいえ。スペースや改行はアルファベットに含まれないため、このページのデコーダーは無視します。折り返された basE91 テキストも、そのまま貼り付けられます。