日本語などのマルチバイト文字は、英数字しか表現できない利用環境では表示できません。
そのため7ビットが基準の電子メールではBase64にエンコードされて内容が送信されています。
このように日本語を英数字で表現すれば暗号感があって楽しいです。
例えば、次の内容を解読してみましょう。
89E3 8AAD
GBJTBEZQNJSYOZXYGCJITY4KVUYGOMCNGBTIE3ZQJMYGGMC7GBTTAWJQNU
1行目は簡単だと思いますが、2行目は出来なくてもかまいません。
暗号みたいにするには、単純にUnicodeにするだけでもかまいませんが、1文字あたり英数字4文字になって文字数が多すぎます。
こんにちは
の場合なら、ひらがなで5文字なのに
U+3053, U+3093 ,U+306B, U+3061, U+306F
でU+を除いても、1文字が英数字4文字で、合計20文字になってしまいます。
これを一般的に使われている符号化のUTF-8にした場合、16進数で表示すると
E3 81 93 E3 82 93 E3 81 AB E3 81 A1 E3 81 AF
となります。
UTF-8を使った場合、日本語は1文字が3バイト使います。日本語5文字を15バイト使っていることでそれがよくわかります。
このような16進数での表示だとスペースを除いても、30文字必要で無駄に長くなって現実的ではありません。
どうやって短くするか
本来短くするのが目的ではありませんが、デジタルデータを特定のルールの上で英数字などの文字だけに変換するエンコードする方式があります。
例えば電子メールのデータは7bitで扱われており、英数字しか扱えませんが、日本語などは普通に使えます。
これは、MINEエンコードという方式で文字が特定の方式でエンコードされて送受信されているからです。
そのメールの中を見ると
Content-Type: text/plain; charset=”UTF-8″; format=flowed; delsp=yes
Content-Transfer-Encoding: base64
などと書かれており、UTF-8で符号化された物がBase64でエンコードされたことがわかります。
これがわからないと、元に戻すは大変になります。よく文字が正しく表示されなくなり、めちゃくちゃな文字が表示されたりする事があります。
これは、符号化やエンコードが正しくない場合に発生する文字化けという現象です。
「こんにちは」を一般的なUTFを使ってBase64エンコードした場合
UTF-8 44GT44KT44Gr44Gh44Gv
UTF-16(BE) MFMwkzBrMGEwbw==
UTF-16(LE) UzCTMGswYTBvMA==
UTF-32(BE) AAAwUwAAMJMAADBrAAAwYQAAMG8=
UTF-32(LE) UzAAAJMwAABrMAAAYTAAAG8wAAA=
となります。UTF-16の場合が最も文字数が少なく、パディング(後半の=)を除いて14文字で表現できる事がわかります。
これはUTF-8は日本語を3バイトで表現するところ、UTF-16は日本語などは2バイトで表現出来るからです。
人間が使う情報として考える
データは短い方がいいので、UTF-16でBase64でエンコードさせればいいのですが、直接デジタルデータを使える場合ならともかく、人間が処理する場合に正しく読み取れるかが問題になります。
人間が文字をみたり、画像処理させるにしても、どこかに表示されている文字をそのまま正しく読み取るのは難しいです。
そこで間違いがないエンコード方式としてBase32があります。
Base64ではアルファベットの大文字、小文字、0とOなど似ている文字もそのまま使いますが、Base32では基本的に大文字、似ている文字は初めから使わないというルールになっています。
「こんにちは」をUTF-16(BE)からBase32にすると GBJTBEZQNMYGCMDP となり16文字になりますが、読み取りミスが発生しにくくなります。
どこかに暗号的に日本語を仕込む場合なら、このUTF-16(BE)からBase32が最も使い勝手がいい方式だと思います。使われている文字数からBase32でエンコードしていることの推理もしやすいです。
UTF-16(LE)よりUTF-16(BE)の方が人が扱いやすいと思うので、この点は説明を省略します。
日本語を英数字で表現して暗号っぽくするまとめ
日本語 5文字 こんにちは
Unicode 英数文字で20文字
UTF-8 英数文字で30文字
UTF-16 英数文字で20文字
UTF-16, Base32 16文字
UTF-16, Base64 14文字
文字数関係なく、簡単に理解されていい物は単純にUnicodeで表示。
文字数を短くする事を目的にするなら、UTF-16, Base64。
人間が読み取りやすくするならUTF-16, Base32。
暗号も度が過ぎると誰にも解析されないかも
何の説明もなく、例えば GBJTBEZQNMYGCMDP と表示してあったとしても、検索しても何も出てきません。
44GT44KT44Gr44Gh44Gv の場合は出てきますが、他のUTF-8をBase64にした物は電子メールでよく使われているので、検索したら出てくるかもしれません。
これらの文字列をみて何らかの形でエンコードされたもの、UTFの何かまでを解析できる人はほとんどいないのではと思います。
関連Webサービス
というわけで、自分でエンコードするのは面倒くさいので勝手にやってくれるWebサービスを作りました。
Unicode Conveter
入力された文字のユニコードを表示するサービス
https://kamikura.com/lab/text2unicode.html
String Encoding Inspector
入力された文字列を様々な形式に自動変換するサービス
https://kamikura.com/lab/StringEncInspector.html
Japanese Text to Base64 Converter
日本語をUTF-16やUTF-8からBase64でエンコードするサービス。日本語以外でも使えるし、デコード機能もあるけど。
https://kamikura.com/lab/JAtexttoBase64.html
Japanese Text to Base32 Converter
文字をUTF-16BEからBase32にエンコードしたりデコードするサービス。日本語以外でも使える。
https://kamikura.com/lab/JAtext2Base32.html