Request-for-Cat 4649: Nekono's Base32 符号化仕様 仕様

猫乃の基底参拾弐 — 任意バイナリをひらがな32文字に符号化する方式

Request For Cat 4649 — 猫乃名無 (仮) 監修
本仕様は 符号化方式 の定義であり、特定の実装・UIには依存しない。リファレンス実装の概要は 本体 および GitHub を参照。

§0. 概要と動機

Nekono's Base32 は、任意のバイト列を ひらがな 32 文字 + 句点パディング で表現する Base32 系符号化方式である。RFC 4648 の Base32 と同じく 5 ビットごとに 1 文字を出力するが、アルファベットを毛筆判読性と OCR 耐性に配慮したひらがなで構成する。

主用途は 内容証明郵便 での任意バイナリ (公開鍵等) の伝送。日本郵便の内容証明は文字種・字数に厳しい制約があり、生のバイナリや英数字混在が避けにくいため、ひらがな縛りの符号化を導入することで対応する。

(注: Request-for-Cat 番号 4649 は IETF 非公認の語呂合わせ。本物の Base32 は RFC 4648。)

§1. 符号化仕様 (Encoding Spec)

§1.1 アルファベット表

5 ビット (値域 0〜31) → ひらがな 1 文字。OCR 誤認・毛筆判読性を考慮して以下 32 文字を採用 (除外したものについては §1.4 参照)。

081624
191725
2101826
3111927
4122028
5132129
6142230
7152331

§1.2 ビット詰めとパディング

入力バイト列の上位ビットから順に 5 ビットずつ取り出してアルファベットを引く (RFC 4648 と同じ big-endian 順)。末尾の余りビットは 0 で埋めてもう 1 文字を出力し、5 バイト境界を満たすまで 句点「。」 をパディングとして付加する。

入力バイト長 mod 5 と出力の関係:

入力バイトデータ文字パディング「。」合計
1268
2448
3538
4718
5808

すなわち 5 バイト (40 ビット) ごとに常に 8 文字を出力する。出力中の「。」の数で残バイト数が一意に決まる。

§1.3 区切り文字 (任意)

可読性のため、出力時に区切り文字を挿入してよい。デコード時は無視 (§2.3)。

推奨フォーマット例:

入力区切りなし推奨フォーマット
A (1 バイト)けお。。。。。。けお。。・。。。。
Hello (5 バイト)こいとはふむえたこいとは・ふむえた
HelloA (6 バイト)
こいとはふむえたけお。。。。。。
↓
こいとは・ふむえた
けお。。・。。。。

§1.4 除外文字とその理由

除外字理由
カタカナ シ/ツ 判別困難、ひらがな ち とも紛らわしい
ぬ・め相互判読不能
ね・れ・わ三つ巴の混同
る・ろ上点の有無、毛筆で判読困難
は と混同 (横棒の差)
カタカナ ヘ と完全一致、文字種規定の抜け穴判定リスク
お と混同
筆跡上 ソ と混同
カタカナ全般同音ひらがなと混同するため一切採用しない

§2. デコーダ寛容性 (Lenient Decoder)

Crockford Base32 の精神に倣い、生成は厳格・受理は寛容 を原則とする。

§2.1 カタカナ→ひらがな自動マッピング

入力中の以下のカタカナは、対応するひらがなとして受理する:

ア→あ イ→い ウ→う エ→え オ→お
カ→か キ→き ク→く ケ→け コ→こ
サ→さ シ→し ス→す セ→せ ソ→そ
タ→た チ→ち テ→て ト→と
ナ→な ニ→に ノ→の
ハ→は ヒ→ひ フ→ふ
マ→ま ミ→み ム→む モ→も
ヤ→や ユ→ゆ ヨ→よ

§2.2 OCR 救済マッピング (debatable)

本符号外のカタカナだが、視覚的近似により以下を 警告付きで 受理:

ツ → し  (シ/ツ 判別困難への救済)
ヘ → ふ  (本来 へ だが本符号外なので最寄りへフォールバック)

§2.3 完全に無視する文字

§2.4 拒絶する文字

§1.4 の除外字 (つ ぬ ね め れ わ る ろ ほ へ を ん) と、対応マッピングのないカタカナ (ヌ ネ リ ル レ ロ メ 等) は デコードエラー とし、入力中の位置と該当文字を実装は提示できなければならない。

§2.5 パディング検証

末尾の「。」の数が §1.2 の表と一致しない場合、厳格モードではエラー。寛容モードでは末尾「。」の過不足を黙って補正してよい (実装側でトグル提供を推奨)。

本体中 (末尾以外) に「。」が現れた場合は寛容モードでも必ずエラーとする。

§3. xxd 相互運用

本仕様自体は xxd に依存しないが、リファレンス実装が xxd と双方向変換を行うため、その動作を以下に規定する。

§3.1 既定形式 (xxd default)

00000000: 4865 6c6c 6f2c 2057 6f72 6c64 210a       Hello, World!.

§3.2 plain hex 形式 (xxd -p)

48656c6c6f2c20576f726c64210a

連続した 16 進文字列。行折り返しあり。

§3.3 パーサ動作

§4. テストベクトル

実装の正しさはこれで担保する。全て検算済み

平文 (UTF-8)xxd -pNekono's Base32 (パディング含む生出力)
(空)(空)(空)
A41けお。。。。。。
Hi4869こいにち。。。。
Cat436174けせちひけ。。。
Hello48656c6c6fこいとはふむえた
e78cabもゆきさは。。。
4649 (ASCII)34363439きちむえけそけ。

§4.1 ラウンドトリップ要件

適合実装は以下の両方を満たさねばならない:

§4.2 ファズ要件

1〜1024 バイトのランダム入力 1000 本でラウンドトリップが完全一致すること。

§5. 参考実装とライセンス

§6. 将来拡張 (Out of Scope)

本仕様では未規定。議論のためのメモのみ: