ROT13/47

ROT13/47

概要

[1] ROT13ASCII の英字にしか効果がなくて、 仮名漢字混じり日本語文 にかけても楽しくないわけですわ。

そこで、 に、 JUNETニュース組 fj.kanji とかで議論されて、 ROT13/47 てのが出来上がりました(らしいです)。

[2] 重要な部分を抜粋すると、

アスキー/ローマ字コードは, エスケープ部分を除いて rot13します. JIS漢字コードは エスケープ部分を除いて rot47します.

JIS以外の漢字コードをROT13/47する場合は,JISに変換した後に 上記の操作を行う. これ以外はROT13/47ではない.

なお、この当時の JUNET の文字コードは今の ISO-2022-JP と同じです。 ESC ( H (瑞典名前文字) は既に使われていません。

[4] ROT13/47 は、暗号化と復号の別がありません。 つまり、二度暗号化すれば元に戻ります。

[7] なお、 ROT13/47 策定の過程で、文字を1つ分だけずらす ROT1 (を漢字に適用したもの) が出てきてます。 あまり面白くないということで没になりました。

[8] 仕様確定後すぐ、 nkf に実装されてます。 (今でも使えます。)

実装について

[3] C の場合

 rotate47(c)
 char c;
 {
 if ((c >= '!')&&(c <= 'O')) return c+47;
 if ((c >= 'P')&&(c <= '~')) return c-47;
 return c;
 }

[5] perl の場合 (このままでは使い物にならない。参考まで。)

 $c =~ tr/\x21-\x4F\x50-\x7E/\x50-\x7E\x21-\x4F/;

[6] 現代的には実装は、場合によっては厄介かもしれません。 一度 Unicode に変換されてしまってたら、復号は困難なことも 少なくないでしょう。 (1978年版または1983年版の JIS 漢字コードなので、 Unicode に対応しない空き区点位置が一杯あります。) (でも大抵は、第1水準漢字が第2水準漢字に化けるだけ であって大丈夫なのかもしれませんが。)

いずれにしろ、 Unicode 化されたものを ROT47 するには 表を使って変換するしかないです。止めた方が良いでしょう。

[9] 現代的には、 1990/1997年版とか2000年版の JIS 漢字コード、 あるいは Unicode の文字列を暗号化したいところですが、 上記で定義されたもの「以外はROT13/47でない」って 言ってますからねえ。

ROT13/47 の拡張てことにします? それもねぇ・・・。 「JIS漢字コード」を拡大解釈して、新しい版の JIS 漢字コード も含まれてた(!)ことにしちまうのがいい鴨。

[13] GitHub - kawabata/rot47, https://github.com/kawabata/rot47#rot47

Original ‘rot47’ is based on JIS X 0208:1983, but to avoid undefined character codes, this implementation adopts JIS X 0213:2014 1st plane.

識別

[10] MIME とかで使う時の媒体型で、 「text/x-rot13-47」 とか 「text/x-rot13-47-48」 が使われたりします (でも -48 て何?)。 けど、それは何か違うと思うのね。 text/html の ROT13/47 はどーなんですか、って。

媒体型は text/* のままで、それに x-rot パラメーターを定義して 使うのが良いと。 (See x-rotパラメーター)

Content-Type: text/html; x-rot="13/47"

って。

(でも、要素名も ROT13 で化けたらそれは HTML じゃないよなー。 要素の属性とか内容だけ化かす? それはそれで復号が面倒。 HTML に ROT13/47 なんて、やめましょーよ。) (それとも、化けてなんぼだから、気にせず要素名とかも化かすのかな?)

[11] text/* 以外の媒体型に適用するのは、絶対に止めた方が良いと思われます。 (だから、 Content-Transfer-Encoding や Content-Encoding にするべきではない。)

指定方法は冗長だけど、

Content-Type: text/plain; x-rot="rot13/47"

にしませう。

[12] 拡張子で内容を判別する環境では、 .rot が使われることがあるみたい。

メモ