string str_rotN(string $str, integer $num)
第一引数 str に対して ROT N変換を施し、 その結果の文字列を返します。Nは第二引数で指定された数値です。
ROT13変換がアルファベット26文字を13文字ずらすのに対し、ROT N変換はアルファベット26文字を指定された文字数分ずらします。
大文字・小文字を個別に処理します。
シーザー暗号あるいはシフト暗号と呼ばれる処理の実装です。
ROT13は単換字式暗号の一つで、「Rotate by 13 places」の略です。str_rotNはその亜種です。シフト暗号とも呼ばれます。
また、古代ローマの軍事的指導者ユリウス・カエサル(ジュリアス・シーザー)が 初めて使ったとされていることから、カエサル暗号・シーザー暗号とも呼ばれます。 もっとも有名で、きわめて単純かつ原始的な暗号と言えます。
ちなみに映画「2001年宇宙の旅」に登場するコンピューター「HAL」の名は、 「IBM」を1文字ずつもどしてずらしてつけられたといわれています。
この手の処理では、「1文字ずつ文字コードにし、ずらす文字数を加算し上限を超えた分は引き、 その結果の文字コードを文字に戻す」というロジックが一般的だと思います。 私も今回そのようなロジックにしようと思っていました。しかし将来の拡張性を考慮し「マルチバイトにも転用可能で、 対象の文字セットが文字コードの順でない場合にも使える」内容にしようと考え、以下のロジックにしました。 もしも以下のコードを使用してマルチバイト文字を扱う場合には、strlenとsubstrを マルチバイト関数(mb_strlen, mb_substr)に置き換えてください。
function str_rotN($str, $num=13) { if (!is_numeric($num)) { return $str; } $abc = "abcdefghijklmnopqrstuvwxyz"; $len = strlen($abc); $num = $num % $len; if ($num == 0) { return $str; } else if ($num < 0) { $num = $num + $len; } $to = substr($abc . $abc, $num, $len); $str = strtr($str, $abc, $to); $str = strtr($str, strtoupper($abc), strtoupper($to)); return $str; }
このページに関するちょっとした感想または、要望、バグ・間違いの指摘などは、下記の送信欄からお送りください。 質問・その他お問合せなど、返信をご希望の方は「こちらのページ」からメッセージをお送りください。
「このページはお役に立ちましたか?」のアンケートと自由メッセージのどちらか一方でかまいません (両方だとよりうれしいです)。お気軽にご利用ください (感想・どんな用途で使用したかなどをいただけると作成・運営の励みになります!)。