githubでfernoって人がbase65536というアイディアを出していて、nodejsのライブラリを作ってた。
https://github.com/ferno/base65536

pythonswiftでも作ってる人たちもいた。

だったらGoLangもしてみんとてするなり!!

base65536って何?

ところでbase65336ってなんだろう?

引用:

Base64 is used to encode arbitrary binary data as "plain" text using a small, extremely safe repertoire of 64 (well, 65) characters. Base64 remains highly suited to text systems where the range of characters available is very small -- i.e., anything still constrained to plain ASCII. Base64 encodes 6 bits, or 3/4 of an octet, per character.
However, now that Unicode rules the world, the range of characters which can be considered "safe" in this way is, in many situations, significantly wider. Base65536 applies the same basic principle to a carefully-chosen repertoire of 65,536 (well, 65,792) Unicode code points, encoding 16 bits, or 2 octets, per character. This allows up to 280 octets of binary data to fit in a Tweet.

引用の訳文:

Base64では平文を任意のバイナリデータにエンコードするために小さく、非常に安全な64種(う〜ん65かな)の文字を使用します。Base64は使用する文字の範囲がとても小さなテキストシステムに適しています。 例えば、プレーンなASCII文字に成約されている場合。Base64は1文字あたり6ビットもしくは3/4オクテットでエンコードします。
しかしながら現在、世界ではUnicodeが使用されており、この文字の範囲は多くの場合、かなり広く安全だと考えられます。Base65536は慎重に選択された65536種(65792かも)のUnicodeポイントを使用し同じ基本原理を利用し、1文字あたり16ビットもしくは2オクテットでエンコードします。これは、ツイートに収まるようにバイナリデータの280オクテットまで使用できます。

わからん!! でも、base64(64種類の文字)でやってたことをunicode(65536種類のコードポイント)でやるってことらしい!!

(´ε`;)ウーン ...
( ー`дー´)キリッ エンコードで使う文字のバラエティが増えるってことね(ざっくり)

つくってみた

https://github.com/usk81/base65536

encode:

s := "hello world"  
result := base65536.Encode(s)

Println(result)  
// 驨ꍬ啯𒁷ꍲᕤ

decode:

s := "驨ꍬ啯𒁷ꍲᕤ"

result := base65536.Decode(s)  
Println(result)  
// hello world

大変だったこと

  • 実家に帰省時の新幹線の中で作ったのでネットが使えなかった(ネットはありがたいものですね)
  • シフト演算ってあんまり使ったことがなかったのであせった
  • swiftで作った人の見ながら作ったので、最初まんまuint32でUTF-8のコードポイントの対応してたけど、よくよく考えたらGolangってint32がまんまUTF-8のコードポイントになることを思い出し作りなおした。