str_rotN

任意の文字数ずらします

ずらす文字数 :
sample

概要

string str_rotN(string $str, integer $num)

第一引数 str に対して ROT N変換を施し、 その結果の文字列を返します。Nは第二引数で指定された数値です。

ROT13変換がアルファベット26文字を13文字ずらすのに対し、ROT N変換はアルファベット26文字を指定された文字数分ずらします。

大文字・小文字を個別に処理します。

補足

コメント

シーザー暗号あるいはシフト暗号と呼ばれる処理の実装です。

この手の処理では、「1文字ずつ文字コードにし、ずらす文字数を加算し上限を超えた分は引き、 その結果の文字コードを文字に戻す」というロジックが一般的だと思います。 私も今回そのようなロジックにしようと思っていました。しかし将来の拡張性を考慮し「マルチバイトにも転用可能で、 対象の文字セットが文字コードの順でない場合にも使える」内容にしようと考え、以下のロジックにしました。 もしも以下のコードを使用してマルチバイト文字を扱う場合には、strlenとsubstrを マルチバイト関数(mb_strlen, mb_substr)に置き換えてください。

ちなみに映画「2001年宇宙の旅」に登場するコンピューター「HAL」の名は、 「IBM」を1文字ずつもどしてずらしてつけられたといわれています。 また、古代ローマのユリウス・カエサルは秘密を要する文書に3文字ずらして暗合化したといわれています。

変換例

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

関連

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

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

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


このページはお役に立ちましたか?