文字変換の練習にJava, Javascript, php で書いた。
JavaでROT13変換する
- A-Z 0x41(65)-0x5a(90)
- A-M 0x41(65)-0x4d(77)
- N-Z 0x4e(78)-0x5a(90)
- a-z 0x61(97)-0x7a(122)
- a-m 0x61(97)-0x6d(109)
n-z 0x6e(110)-0x7a(122)
package jp.fernweh; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Fw8k { private Fw8k() {} public static void main(String[] args) { String s2, s1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; System.out.println(s1); s2 = strRot13(s1); System.out.println(strRot13(s2)); System.out.println(s2); } public static String strRot13(String s) { // 正規表現で対象文字列の確認 Matcher m = Pattern.compile("[a-zA-Z]").matcher(s); if (!m.find()) { return s; } // 対象文字のキャラクタコードをルールに従って増減する char[] a = s.toCharArray(); s = ""; for (char c : a) { if (64 < c && c < 78 || 96 < c && c < 110) { c += 13; } else if (77 < c && c < 91 || 109 < c && c < 123) { c -= 13; } // 毎回Stringオブジェクト生成することになる? // パフォーマンス的にどうなのだろう s += c; } return s; } }
結果
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM
Javaでコールバック置換どうやるか知らないからとりあえずはコレでいいや。
JavasciptでROT47
- !-~ 0x22(33)-ox7e(126)
- !-O 0x22(33)-0x4f(79)
P-~ 0x50(80)-0x7e(126)
function str_rot47(str) { return str.replace(/[!-~]+/g, function(m0){ for(var i = 0, l = m0.length, c, res = []; i < l; i++) { c = m0.charCodeAt(i); if(32 < c && c < 80) c += 47; else if(79 < c && c < 127) c -= 47; res.push(String.fromCharCode(c)); } return res.join(''); }); }
PHPでROT47
function str_rot47($str){
return preg_replace_callback('/[!-~]/u',
create_function(
'$m',
'
$c = ord($m[0]);
if(32 < $c && $c < 80)
$c += 47;
else if(79 < $c && $c < 127)
$c -= 47;
return chr($c);
'
),
$str
);
}
無名関数を使う場合
function str_rot47 ($str) {
return preg_replace_callback(
'/[!-~]/u',
function ($m) {
$c = ord($m[0]);
if(32 < $c && $c < 80)
$c += 47;
else if(79 < $c && $c < 127)
$c -= 47;
return chr($c);
},
$str);
}