str_rotN

任意の文字数ずらします

ずらす文字数 :
sample

概要

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)に置き換えてください。

変換例

  • apple, 13 → nccyr
  • str_rotN, 13 → fge_ebgA
  • IBM, -1 → HAL
  • caesar, 3 → fdhvdu

コード

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;
}

関連・参考リンク

ちょこっとアンケート&メッセージ

このページに関するちょっとした感想または、要望、バグ・間違いの指摘などは、下記の送信欄からお送りください。 質問・その他お問合せなど、返信をご希望の方は「こちらのページ」からメッセージをお送りください。

「このページはお役に立ちましたか?」のアンケートと自由メッセージのどちらか一方でかまいません (両方だとよりうれしいです)。お気軽にご利用ください (感想・どんな用途で使用したかなどをいただけると作成・運営の励みになります!)


このページはお役に立ちましたか?
自由メッセージ
認証コード 必須
画像のひらがな一文字を入力してください。拗音・促音・濁点・半濁点はありません。
※サンプルの追加・ツール改善の参考に利用させていただきます。