猫乃の基底参拾弐 — 任意バイナリをひらがな32文字に符号化する方式
Request For Cat 4649 — 猫乃名無 (仮) 監修
本仕様は 符号化方式 の定義であり、特定の実装・UIには依存しない。リファレンス実装の概要は 本体 および GitHub を参照。
Nekono's Base32 は、任意のバイト列を ひらがな 32 文字 + 句点パディング で表現する Base32 系符号化方式である。RFC 4648 の Base32 と同じく 5 ビットごとに 1 文字を出力するが、アルファベットを毛筆判読性と OCR 耐性に配慮したひらがなで構成する。
主用途は 内容証明郵便 での任意バイナリ (公開鍵等) の伝送。日本郵便の内容証明は文字種・字数に厳しい制約があり、生のバイナリや英数字混在が避けにくいため、ひらがな縛りの符号化を導入することで対応する。
(注: Request-for-Cat 番号 4649 は IETF 非公認の語呂合わせ。本物の Base32 は RFC 4648。)
5 ビット (値域 0〜31) → ひらがな 1 文字。OCR 誤認・毛筆判読性を考慮して以下 32 文字を採用 (除外したものについては §1.4 参照)。
| 値 | 字 | 値 | 字 | 値 | 字 | 値 | 字 |
|---|---|---|---|---|---|---|---|
| 0 | あ | 8 | け | 16 | ち | 24 | ふ |
| 1 | い | 9 | こ | 17 | て | 25 | ま |
| 2 | う | 10 | さ | 18 | と | 26 | み |
| 3 | え | 11 | し | 19 | な | 27 | む |
| 4 | お | 12 | す | 20 | に | 28 | も |
| 5 | か | 13 | せ | 21 | の | 29 | や |
| 6 | き | 14 | そ | 22 | は | 30 | ゆ |
| 7 | く | 15 | た | 23 | ひ | 31 | よ |
入力バイト列の上位ビットから順に 5 ビットずつ取り出してアルファベットを引く (RFC 4648 と同じ big-endian 順)。末尾の余りビットは 0 で埋めてもう 1 文字を出力し、5 バイト境界を満たすまで 句点「。」 をパディングとして付加する。
入力バイト長 mod 5 と出力の関係:
| 入力バイト | データ文字 | パディング「。」 | 合計 |
|---|---|---|---|
| 1 | 2 | 6 | 8 |
| 2 | 4 | 4 | 8 |
| 3 | 5 | 3 | 8 |
| 4 | 7 | 1 | 8 |
| 5 | 8 | 0 | 8 |
すなわち 5 バイト (40 ビット) ごとに常に 8 文字を出力する。出力中の「。」の数で残バイト数が一意に決まる。
可読性のため、出力時に区切り文字を挿入してよい。デコード時は無視 (§2.3)。
推奨フォーマット例:
| 入力 | 区切りなし | 推奨フォーマット |
|---|---|---|
A (1 バイト) | けお。。。。。。 | けお。。・。。。。 |
Hello (5 バイト) | こいとはふむえた | こいとは・ふむえた |
HelloA (6 バイト) | | |
| 除外字 | 理由 |
|---|---|
| つ | カタカナ シ/ツ 判別困難、ひらがな ち とも紛らわしい |
| ぬ・め | 相互判読不能 |
| ね・れ・わ | 三つ巴の混同 |
| る・ろ | 上点の有無、毛筆で判読困難 |
| ほ | は と混同 (横棒の差) |
| へ | カタカナ ヘ と完全一致、文字種規定の抜け穴判定リスク |
| を | お と混同 |
| ん | 筆跡上 ソ と混同 |
| カタカナ全般 | 同音ひらがなと混同するため一切採用しない |
Crockford Base32 の精神に倣い、生成は厳格・受理は寛容 を原則とする。
入力中の以下のカタカナは、対応するひらがなとして受理する:
ア→あ イ→い ウ→う エ→え オ→お
カ→か キ→き ク→く ケ→け コ→こ
サ→さ シ→し ス→す セ→せ ソ→そ
タ→た チ→ち テ→て ト→と
ナ→な ニ→に ノ→の
ハ→は ヒ→ひ フ→ふ
マ→ま ミ→み ム→む モ→も
ヤ→や ユ→ゆ ヨ→よ
本符号外のカタカナだが、視覚的近似により以下を 警告付きで 受理:
ツ → し (シ/ツ 判別困難への救済)
ヘ → ふ (本来 へ だが本符号外なので最寄りへフォールバック)
§1.4 の除外字 (つ ぬ ね め れ わ る ろ ほ へ を ん) と、対応マッピングのないカタカナ (ヌ ネ リ ル レ ロ メ 等) は デコードエラー とし、入力中の位置と該当文字を実装は提示できなければならない。
末尾の「。」の数が §1.2 の表と一致しない場合、厳格モードではエラー。寛容モードでは末尾「。」の過不足を黙って補正してよい (実装側でトグル提供を推奨)。
本体中 (末尾以外) に「。」が現れた場合は寛容モードでも必ずエラーとする。
本仕様自体は xxd に依存しないが、リファレンス実装が xxd と双方向変換を行うため、その動作を以下に規定する。
00000000: 4865 6c6c 6f2c 2057 6f72 6c64 210a Hello, World!.
: .)。パース時は無視。48656c6c6f2c20576f726c64210a
連続した 16 進文字列。行折り返しあり。
: の有無で自動判定実装の正しさはこれで担保する。全て検算済み。
| 平文 (UTF-8) | xxd -p | Nekono's Base32 (パディング含む生出力) |
|---|---|---|
| (空) | (空) | (空) |
A | 41 | けお。。。。。。 |
Hi | 4869 | こいにち。。。。 |
Cat | 436174 | けせちひけ。。。 |
Hello | 48656c6c6f | こいとはふむえた |
猫 | e78cab | もゆきさは。。。 |
4649 (ASCII) | 34363439 | きちむえけそけ。 |
適合実装は以下の両方を満たさねばならない:
bytes → encode → decode が恒等bytes → encode → format(区切り挿入) → decode が恒等1〜1024 バイトのランダム入力 1000 本でラウンドトリップが完全一致すること。
本仕様では未規定。議論のためのメモのみ:
-----始める 猫乃の鍵----- / -----終わる 猫乃の鍵----- で囲む