例えば slack で言いづらいことを暗号化(難読化)して分かる奴だけに伝えたい時ってありますよね?
(だったらDMしろよ!という声が聞こえなくも無いですが・・・)
るあてっはでテムガに らうのータニモはギカ のえくづでそ
これは単に rev | fold しただけなのでバレバレですが、
もうちょっと簡単に難読化したいですよね?
嚮囑囈嘲嘛圄壓壙圉坡奢夥倬圄嗾唳囹壑埀奕囑圉囃囎嗔喙
何と nkf -r で出来ます!
$ echo 'そでづくえのカギはモニターのうらにガムテではってある' | nkf -r
嚮囑囈嘲嘛圄壓壙圉坡奢夥倬圄嗾唳囹壑埀奕囑圉囃囎嗔喙
$ echo 'そでづくえのカギはモニターのうらにガムテではってある' | nkf -r | nkf -r
そでづくえのカギはモニターのうらにガムテではってある
漢字は変換時に欠落することがあるので、ひらがな、カタナカのみがお勧めです
ぜひスラッシュコマンドに登録しておきましょう(←しない)
rot13は普通 a-zA-Z の変換を指しますよね
# マルチバイト文字はそのまま
$ python -c 'import codecs; print(codecs.encode("海賊王にoreはなる!", "rot-13"))'
海賊王にberはなる!
で、たまたま ROT13 - Qiita を眺めてたところ
nkf -r と書いてあるのを見つけ、何このオプションと思ったら
$ man nkf | grep -wF -- -r
-r ROT13/47 の変換をする。
で、試しにやってみたら
$ echo "海賊王にoreはなる!" | nkf -r
瞋騾疸囹ber圉囮喙!
すげー!
と思ったのも束の間、
# 欠ける例
$ echo 袖机の鍵はモニターの裏にガムテで貼ってある | nkf -r | nkf -r
袖机の鍵はモニターのにガムテでってある
でもまぁ、ひらがな、カタカナがセーフならいいじゃん、と思いチェックしてみる
# utf-8 でひらがな全部
$ echo -e "\u30"{4..9}{0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f}
぀ ぁ あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く ぐ け げ こ ご さ ざ し じ す ず せ ぜ そ ぞ た だ ち ぢ っ つ づ て で と ど な に ぬ ね の は ば ぱ ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ ぼ ぽ ま み む め も ゃ や ゅ ゆ ょ よ ら り る れ ろ ゎ わ ゐ ゑ を ん ゔ ゕ ゖ ゗ ゘ ゙ ゚ ゛ ゜ ゝ ゞ ゟ
# 2回変換して元に戻るかチェック
$ diff -u \
<(echo -e "\u30"{4..9}{0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f}| xargs -n1) \
<(echo -e "\u30"{4..9}{0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f} | nkf -r | nkf -r | xargs -n1)
(出力無し)
割愛しますが、カタカナも元に戻りました
nkfのソースだとこの辺あたりのようです
$ git clone https://scm.osdn.net/gitroot/nkf/nkf.git
$ cd nkf/
$ grep -rinw rot13
(略)
nkf.c:4156:#define rot13(c) ( \
nkf.c:4177: c1 = rot13(c1);
(略)
nkf.c
4156 #define rot13(c) ( \
4157 ( c < 'A') ? c: \
4158 (c <= 'M') ? (c + 13): \
4159 (c <= 'Z') ? (c - 13): \
4160 (c < 'a') ? (c): \
4161 (c <= 'm') ? (c + 13): \
4162 (c <= 'z') ? (c - 13): \
4163 (c) \
4164 )
4165
4166 #define rot47(c) ( \
4167 ( c < '!') ? c: \
4168 ( c <= 'O') ? (c + 47) : \
4169 ( c <= '~') ? (c - 47) : \
4170 c \
4171 )
4172
4173 static void
4174 rot_conv(nkf_char c2, nkf_char c1)
4175 {
4176 if (c2 == 0 || c2 == JIS_X_0201_1976_K || c2 == ISO_8859_1) {
4177 c1 = rot13(c1);
4178 } else if (c2) {
4179 c1 = rot47(c1);
4180 c2 = rot47(c2);
4181 }
4182 (*o_rot_conv)(c2,c1);
4183 }
マルチバイト文字を考慮しているのかは・・・(分からず/たまたまうまく動いている、と信じよう)