短縮 URL なんかだと、Base58 (Base64の中から、表示上まぎらわしい文字を削除したもの) を使ってただの数値を短かくする工夫をしていたりするが、それをもうすこし汎用的に使いたいので書いてみた。

実用性に疑問があるので CPAN にあげてはいない。

経緯

ある文字数制限のあるフィールドに、できるだけ邪魔にならないように数値を埋めこみたいと思った。任意の数字なので、特に bigint になると数字そのままでは文字数がばかにならない。そこで Unicode を使ってエンコードすることを思いついた。バイト数的には不利なのだけれど、文字数による制限であれば、Unicode 文字はたくさんあるのでもっと短くなると考えた。

使う文字セットはなんでもいいけど、ぱっと見で脳が読もうとしない、意味を理解しないものがいいと思い探していたところ、点字だと、なんと丁度 256 文字あるし、ぱっと見がかっこいいのでそれでまず Base256 というのを作った。

ちなみにこれだと '9235113611380768826' という数値 (19文字) は、'⢀⠩⢶⣦⡚⢹⣀⠺' という文字列 (8文字) にエンコードできる。

ただ、Base256 だと汎用性がなく、なおかつ Unicode の点字の文字セットを使うというのだとあまりにもニッチすぎるので、任意の文字セットを使えるようなものならまだマシかと思い BaseN を作った。

  1. トップ
  2. tech
  3. 任意の文字セットで数値をエンコードできる Encode::BaseN