日本語を許容するパーセントエンコーディング

公開日:2019-07-01
最終更新:2019-07-03

前置き

構造を持ったテキストベースのプロトコルで任意のデータを表現したいとき、構造を破壊しないためにデータ部分をエンコードすることはよくある。

例えば、メールではヘッダ内の件名などに改行コードがあると壊れる・7bitのasciiコードしか許容されない場合があるといった事情から、ヘッダの日本語をBase64エンコードする・添付ファイルをBase64エンコードするなどの処理がなされている。
Subject: =?ISO-2022-JP?B?GyRCN29MPiRHJDkhIxsoQg==?=
http://blog.smtps.jp/entry/2017/11/09/101125

URLに使われるパーセントエンコーディングもその一種であり、Wikipediaの「ABCテレビ」の記事のURLは以下のようになっている。
https://ja.wikipedia.org/wiki/ABC%E3%83%86%E3%83%AC%E3%83%93

「ABC」はエンコードされず、「テレビ」はUTF-8化され、1バイトごとに%+16進数表記されている。

おそらくは英語圏の人が「可読性は高く、かつ、任意のバイナリを表現できる」形式として考えたのだと思われる。
ただ、日本人としてはもっと可読性が高いと嬉しいなと思うこともある。
ひらがな・カタカナ・漢字がプロトコルの形式を壊すことは(UTF-8を使う限り)あまりないはずで、これらの文字もエンコードせずに残してほしい。

試作

というわけで、日本語を許容するパーセントエンコーディングを試作した。(goの勉強も兼ねている)
https://github.com/mob-a/study/tree/master/urlencode

「ABCテレビ」は符号化されないが、改行コードやニッチな記号などは符号化される。

$ echo -en "ABCテレビ" | ./trie-url-encode  
ABCテレビ  

$ echo -en "ABC\nテレビ‰" | ./trie-url-encode  
ABC%0aテレビ%e2%80%b0  

デコードも当然可能。

$ echo -en "ABC\nテレビ‰" | ./trie-url-encode | ./trie-url-decode  
ABC  
テレビ‰  

設計

まずは、符号化しない文字(列)の一覧を辞書ファイルを用意する。今回はJISX 0208から文字を取得してきた(一部削除)。
この辞書ファイルはUTF-8・LF区切りにして、urlencode-go-dict.txtという名前で保存する。
辞書に含める文字を自分好みにカスタマイズすることも可能である。

a  
b  
c  
... 略 ...  
ぁ  
あ  
ぃ  
い  
... 略 ...  
瑤  
凜  
熙  

エンコード時には、入力バイト列から、辞書に含まれるバイト列であれば符号化しない、それ以外のバイト列は符号化する、という処理を行う。
内部的には、辞書を1バイト単位のTrie構造に変換して辞書エントリの探索を効率化している。

デコードは素直に入力が %XX なら符号化する、そうでなければそのまま入力バイト列を出力する、という処理をしている。

記事が少しでもいいなと思ったらクラップを送ってみよう!
24
+1
@JNxMi61xSvk7hE1aの技術ブログ

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする