base256エンコード

# これは何？

base64 があるなら、base256 があってもいいんじゃないかと思って記事にした。

# base64

base64 は、ふつうに使える文字で普通のバイト列を送りたいと思って作ったもの。
ASCII の、制御文字以外で、7bit 文字のみという制約でも 64種類の文字があれば 一文字で 6bit の情報になる。
4文字あれば、3バイトになる。

というもの

# base256

## おもいつき

今は unicode があるので、文字を 256 種類用意するのはたやすい。
だったら 256 種類使っちゃえばいいよね、と思った。

utf-8 にすると 1文字2バイト（など）になるのでバイト列としての効率は悪くなるけど、そもそもテキストに変換している時点でバイト列としての効率なんて気にしてないんじゃないかと思う。

ASCII の英数字と同じ幅の文字を採用すれば、画面に占めるサイズとしては小さくなる。
そのまま使える文字を残すことで、エンコードされた状態でもぼんやり中身がわかったりして便利。

## 仕様案

英数字と下線はそのまま使う。
それ以外は変換テーブルで変換。

変換テーブル案は下記。

|binary|00|01|02|03|04|05|06|07|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`À`(U+c0)|`Á`(U+c1)|`Â`(U+c2)|`Ã`(U+c3)|`Ä`(U+c4)|`Å`(U+c5)|`Æ`(U+c6)|`Ç`(U+c7)|

|binary|08|09|0a|0b|0c|0d|0e|0f|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`È`(U+c8)|`É`(U+c9)|`Ê`(U+ca)|`Ë`(U+cb)|`Ì`(U+cc)|`Í`(U+cd)|`Î`(U+ce)|`Ï`(U+cf)|

|binary|10|11|12|13|14|15|16|17|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`Ð`(U+d0)|`Ñ`(U+d1)|`Ò`(U+d2)|`Ó`(U+d3)|`Ô`(U+d4)|`Õ`(U+d5)|`Ö`(U+d6)|`Ø`(U+d8)|

|binary|18|19|1a|1b|1c|1d|1e|1f|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`Ù`(U+d9)|`Ú`(U+da)|`Û`(U+db)|`Ü`(U+dc)|`Ý`(U+dd)|`Þ`(U+de)|`ß`(U+df)|`à`(U+e0)|

|binary|20|21|22|23|24|25|26|27|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`á`(U+e1)|`â`(U+e2)|`ã`(U+e3)|`ä`(U+e4)|`å`(U+e5)|`æ`(U+e6)|`ç`(U+e7)|`è`(U+e8)|

|binary|28|29|2a|2b|2c|2d|2e|2f|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`é`(U+e9)|`ê`(U+ea)|`ë`(U+eb)|`ì`(U+ec)|`í`(U+ed)|`î`(U+ee)|`ï`(U+ef)|`ð`(U+f0)|

|binary|30(`0`)|31(`1`)|32(`2`)|33(`3`)|34(`4`)|35(`5`)|36(`6`)|37(`7`)|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`0`(U+30)|`1`(U+31)|`2`(U+32)|`3`(U+33)|`4`(U+34)|`5`(U+35)|`6`(U+36)|`7`(U+37)|

|binary|38(`8`)|39(`9`)|3a|3b|3c|3d|3e|3f|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`8`(U+38)|`9`(U+39)|`ñ`(U+f1)|`ò`(U+f2)|`ó`(U+f3)|`ô`(U+f4)|`õ`(U+f5)|`ö`(U+f6)|

|binary|40|41(`A`)|42(`B`)|43(`C`)|44(`D`)|45(`E`)|46(`F`)|47(`G`)|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`Ā`(U+100)|`A`(U+41)|`B`(U+42)|`C`(U+43)|`D`(U+44)|`E`(U+45)|`F`(U+46)|`G`(U+47)|

|binary|48(`H`)|49(`I`)|4a(`J`)|4b(`K`)|4c(`L`)|4d(`M`)|4e(`N`)|4f(`O`)|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`H`(U+48)|`I`(U+49)|`J`(U+4a)|`K`(U+4b)|`L`(U+4c)|`M`(U+4d)|`N`(U+4e)|`O`(U+4f)|

|binary|50(`P`)|51(`Q`)|52(`R`)|53(`S`)|54(`T`)|55(`U`)|56(`V`)|57(`W`)|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`P`(U+50)|`Q`(U+51)|`R`(U+52)|`S`(U+53)|`T`(U+54)|`U`(U+55)|`V`(U+56)|`W`(U+57)|

|binary|58(`X`)|59(`Y`)|5a(`Z`)|5b|5c|5d|5e|5f(`_`)|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`X`(U+58)|`Y`(U+59)|`Z`(U+5a)|`ā`(U+101)|`Ă`(U+102)|`ă`(U+103)|`Ą`(U+104)|`_`(U+5f)|

|binary|60|61(`a`)|62(`b`)|63(`c`)|64(`d`)|65(`e`)|66(`f`)|67(`g`)|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`ą`(U+105)|`a`(U+61)|`b`(U+62)|`c`(U+63)|`d`(U+64)|`e`(U+65)|`f`(U+66)|`g`(U+67)|

|binary|68(`h`)|69(`i`)|6a(`j`)|6b(`k`)|6c(`l`)|6d(`m`)|6e(`n`)|6f(`o`)|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`h`(U+68)|`i`(U+69)|`j`(U+6a)|`k`(U+6b)|`l`(U+6c)|`m`(U+6d)|`n`(U+6e)|`o`(U+6f)|

|binary|70(`p`)|71(`q`)|72(`r`)|73(`s`)|74(`t`)|75(`u`)|76(`v`)|77(`w`)|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`p`(U+70)|`q`(U+71)|`r`(U+72)|`s`(U+73)|`t`(U+74)|`u`(U+75)|`v`(U+76)|`w`(U+77)|

|binary|78(`x`)|79(`y`)|7a(`z`)|7b|7c|7d|7e|7f|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`x`(U+78)|`y`(U+79)|`z`(U+7a)|`Ć`(U+106)|`ć`(U+107)|`Ĉ`(U+108)|`ĉ`(U+109)|`Ċ`(U+10a)|

|binary|80|81|82|83|84|85|86|87|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`ċ`(U+10b)|`Č`(U+10c)|`č`(U+10d)|`Ď`(U+10e)|`ď`(U+10f)|`Đ`(U+110)|`đ`(U+111)|`Ē`(U+112)|

|binary|88|89|8a|8b|8c|8d|8e|8f|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`ē`(U+113)|`Ĕ`(U+114)|`ĕ`(U+115)|`Ė`(U+116)|`ė`(U+117)|`Ę`(U+118)|`ę`(U+119)|`Ě`(U+11a)|

|binary|90|91|92|93|94|95|96|97|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`ě`(U+11b)|`Ĝ`(U+11c)|`ĝ`(U+11d)|`Ğ`(U+11e)|`ğ`(U+11f)|`Ġ`(U+120)|`ġ`(U+121)|`Ģ`(U+122)|

|binary|98|99|9a|9b|9c|9d|9e|9f|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`ģ`(U+123)|`Ĥ`(U+124)|`ĥ`(U+125)|`Ħ`(U+126)|`ħ`(U+127)|`Ĩ`(U+128)|`ĩ`(U+129)|`Ī`(U+12a)|

|binary|a0|a1|a2|a3|a4|a5|a6|a7|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`ī`(U+12b)|`Ĭ`(U+12c)|`ĭ`(U+12d)|`Į`(U+12e)|`į`(U+12f)|`İ`(U+130)|`ı`(U+131)|`Ĳ`(U+132)|

|binary|a8|a9|aa|ab|ac|ad|ae|af|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`ĳ`(U+133)|`Ĵ`(U+134)|`ĵ`(U+135)|`Ķ`(U+136)|`ķ`(U+137)|`ĸ`(U+138)|`Ĺ`(U+139)|`ĺ`(U+13a)|

|binary|b0|b1|b2|b3|b4|b5|b6|b7|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`Ļ`(U+13b)|`ļ`(U+13c)|`Ľ`(U+13d)|`ľ`(U+13e)|`Ŀ`(U+13f)|`ŀ`(U+140)|`Ł`(U+141)|`ł`(U+142)|

|binary|b8|b9|ba|bb|bc|bd|be|bf|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`Ń`(U+143)|`ń`(U+144)|`Ņ`(U+145)|`ņ`(U+146)|`Ň`(U+147)|`ň`(U+148)|`ŉ`(U+149)|`Ŋ`(U+14a)|

|binary|c0|c1|c2|c3|c4|c5|c6|c7|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`ŋ`(U+14b)|`Ō`(U+14c)|`ō`(U+14d)|`Ŏ`(U+14e)|`ŏ`(U+14f)|`Ő`(U+150)|`ő`(U+151)|`Œ`(U+152)|

|binary|c8|c9|ca|cb|cc|cd|ce|cf|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`œ`(U+153)|`Ŕ`(U+154)|`ŕ`(U+155)|`Ŗ`(U+156)|`ŗ`(U+157)|`Ř`(U+158)|`ř`(U+159)|`Ś`(U+15a)|

|binary|d0|d1|d2|d3|d4|d5|d6|d7|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`ś`(U+15b)|`Ŝ`(U+15c)|`ŝ`(U+15d)|`Ş`(U+15e)|`ş`(U+15f)|`Š`(U+160)|`š`(U+161)|`Ţ`(U+162)|

|binary|d8|d9|da|db|dc|dd|de|df|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`ţ`(U+163)|`Ť`(U+164)|`ť`(U+165)|`Ŧ`(U+166)|`ŧ`(U+167)|`Ũ`(U+168)|`ũ`(U+169)|`Ū`(U+16a)|

|binary|e0|e1|e2|e3|e4|e5|e6|e7|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`ū`(U+16b)|`Ŭ`(U+16c)|`ŭ`(U+16d)|`Ů`(U+16e)|`ů`(U+16f)|`Ű`(U+170)|`ű`(U+171)|`Ų`(U+172)|

|binary|e8|e9|ea|eb|ec|ed|ee|ef|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`ų`(U+173)|`Ŵ`(U+174)|`ŵ`(U+175)|`Ŷ`(U+176)|`ŷ`(U+177)|`Ÿ`(U+178)|`Ź`(U+179)|`ź`(U+17a)|

|binary|f0|f1|f2|f3|f4|f5|f6|f7|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`Ż`(U+17b)|`ż`(U+17c)|`Ž`(U+17d)|`ž`(U+17e)|`ſ`(U+17f)|`ƀ`(U+180)|`Ɓ`(U+181)|`Ƃ`(U+182)|

|binary|f8|f9|fa|fb|fc|fd|fe|ff|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|encoded|`ƃ`(U+183)|`Ƅ`(U+184)|`ƅ`(U+185)|`Ɔ`(U+186)|`Ƈ`(U+187)|`ƈ`(U+188)|`Ɖ`(U+189)|`Ɗ`(U+18a)|

## 補足

* base256 → バイナリ変換時は、改行空白を読み飛ばす。
* 終端記号がある方が便利かもしれないけど、無くていいかなと思った。
* `\`、`%`, `"` 等が含まれないので、そのままファイル名に使うとかもありかも。
* 前述の変換テーブルはまったく深く考えずに作ったけど、以下に留意してもうちょっと真剣に考えると利便性が高まるかも。
  * 多くのフォントに含まれる文字が良い。
  * 幅が ASCII の英数字と同じになる場合が多い文字が良い。
  * UTF-8 で 2バイト以下になる文字が良い。
  * 句読点とみなされない文字が良い。
  * 英数字っぽくない見た目がいいかも。

シフトJIS などに変換されたら失われる文字が無いほうが便利かもしれないけど、シフトJIS互換ルールよりも UTF-8 で 2バイト以下ルールが大事じゃないかと思う。どうだろ。両方満たすことができればそれは嬉しいけど、無理じゃないかと想像する（未調査）。