[1] ROT13は ASCII の英字にしか効果がなくて、 仮名漢字混じりの日本語文 にかけても楽しくないわけですわ。
そこで、
に、 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 (を漢字に適用したもの) が出てきてます。 あまり面白くないということで没になりました。
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"
にしませう。