* 概要

[1] [[ROT13]]は [[ASCII]] の英字にしか効果がなくて、
[[仮名漢字混じり]]の[[日本語文]]
にかけても楽しくないわけですわ。

そこで、 
[TIME[昭和62(1987)年][1987]]に、 [[JUNET]] の[[ニュース組]] [CODE[fj.kanji]]
とかで議論されて、 ROT13/47 てのが出来上がりました(らしいです)。

[2] 重要な部分を抜粋すると、

> アスキー/ローマ字コードは,
エスケープ部分を除いて
rot13します.
JIS漢字コードは
エスケープ部分を除いて
rot47します.
> JIS以外の漢字コードをROT13/47する場合は,JISに変換した後に
上記の操作を行う.
これ以外はROT13/47ではない.

なお、この当時の JUNET の文字コードは今の [[ISO-2022-JP]] 
と同じです。 [CODE[ESC ( H]] ([[瑞典名前文字]]) は既に使われていません。

[4] ROT13/47 は、暗号化と復号の別がありません。
つまり、二度暗号化すれば元に戻ります。

[7] なお、 ROT13/47 策定の過程で、文字を1つ分だけずらす
ROT1 (を漢字に適用したもの) が出てきてます。
あまり面白くないということで没になりました。

[8] 仕様確定後すぐ、 [[nkf]] に実装されてます。 (今でも使えます。)

* 実装について

[3] [[C]] の場合
[PRE[
 rotate47(c)
 char c;
 {
 if ((c >= '!')&&(c <= 'O')) return c+47;
 if ((c >= 'P')&&(c <= '~')) return c-47;
 return c;
 }
]PRE]

[5] [[perl]] の場合 (このままでは使い物にならない。参考まで。)
[PRE[
 $c =~ tr/\x21-\x4F\x50-\x7E/\x50-\x7E\x21-\x4F/;
]PRE]

[6] 現代的には実装は、場合によっては厄介かもしれません。
一度 Unicode に変換されてしまってたら、復号は困難なことも
少なくないでしょう。
(1978年版または1983年版の JIS 漢字コードなので、
Unicode に対応しない空き区点位置が一杯あります。)
(でも大抵は、第1水準漢字が第2水準漢字に化けるだけ
であって大丈夫なのかもしれませんが。)

いずれにしろ、 Unicode 化されたものを ROT47 するには
表を使って変換するしかないです。止めた方が良いでしょう。

[9] 現代的には、 1990/1997年版とか2000年版の JIS 漢字コード、
あるいは Unicode の文字列を暗号化したいところですが、
上記で定義されたもの「以外はROT13/47でない」って
言ってますからねえ。

ROT13/47 の拡張てことにします? それもねぇ・・・。
「JIS漢字コード」を拡大解釈して、新しい版の JIS 漢字コード
も含まれてた(!)ことにしちまうのがいい鴨。

[13] [CITE@en[GitHub - kawabata/rot47]], [TIME[2023-07-06T14:19:14.000Z]] <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」 が使われたりします (でも [CODE[-48]] て何?)。
けど、それは何か違うと思うのね。
text/html の ROT13/47 はどーなんですか、って。 

媒体型は text/* のままで、それに x-rot パラメーターを定義して
使うのが良いと。 (See [[x-rotパラメーター]])

[DEL[

> Content-Type: text/html; x-rot="13/47"

って。 
]DEL]

(でも、要素名も ROT13 で化けたらそれは HTML じゃないよなー。
要素の属性とか内容だけ化かす? それはそれで復号が面倒。
HTML に ROT13/47 なんて、やめましょーよ。)
(それとも、化けてなんぼだから、気にせず要素名とかも化かすのかな?)

[11] text/* 以外の媒体型に適用するのは、絶対に止めた方が良いと思われます。 
(だから、 Content-Transfer-Encoding や Content-Encoding にするべきではない。)

[DEL[

指定方法は冗長だけど、

> Content-Type: text/plain; x-rot="rot13/47"

にしませう。
]DEL]

[12] [[拡張子]]で内容を判別する環境では、 .rot が使われることがあるみたい。
[[#comment]]


* メモ