開発部のおいぬです(▽・x・▽)
今回はひらがなをモールス信号に変換するシステムを作ってみました。
みなさんは幼少期に暗号を読み書きすることに憧れた時期はありましたでしょうか?
私にはありました。よくわからない暗号とあいうえおの対応表を作り、誰かに見せるわけでも無くただ楽しく暗号を書いていました。そんな幼少期を思い出して、暗号化と復元をボタンひとつで行えるようなシステムを作ってみました。
Contents
モールス符号(信号)とは?
モールス符号(モールスふごう、英語: Morse code)は、電信で用いられている可変長符号化された文字コードである。モールス符号を使った信号はモールス信号と呼ばれる。
(wikipediaより引用)
短点(・)と長点(-)と間隔の組み合わせでアルファベットや数字を表現します。よく使われる文字は短い符号になるように工夫されてたり、長点一つは短点3つ分の長さだったり、和文と欧文で表現がちがってたりなど、いろいろ規則があるみたいです。
今回使ったのはこちらのモールス符号一覧表です。
なぜモールス信号を選んだかというと、暗号と言えば…って考えて一番はじめに「モールス信号」が出てきたので、モールス信号にしました。
作ってみました
完成したものはこちら↓
作ってみたページへいく
プログラムはこんな感じ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
<?php $kana_morusu = array( "あ" => "--・--","い" => "・-","う" => "・・-","え" => "-・---","お" => "・-・・・", "か" => "・-・・","き" => "-・-・・","く" => "・・・-","け" => "-・--","こ" => "----", "さ" => "-・-・-","し" => "--・-・","す" => "---・-","せ" => "・---・","そ" => "---・", "た" => "-・","ち" => "・・-・","つ" => "・--・","て" => "・-・--","と" => "・・-・・", "な" => "・-・","に" => "-・-・","ぬ" => "・・・・","ね" => "--・-","の" => "・・--", "は" => "-・・・","ひ" => "--・・-","ふ" => "--・・","へ" => "・","ほ" => "-・・", "ま" => "-・・-","み" => "・・-・-","む" => "-","め" => "-・・・-","も" => "-・・-・", "や" => "・--","ゆ" => "-・・--","よ" => "--", "ら" => "・・・","り" => "--・","る" => "-・--・","れ" => "---","ろ" => "・-・-", "わ" => "-・-","を" => "・---", "が" => "・-・・ ・・","ぎ" => "-・-・・ ・・","ぐ" => "・・・- ・・","げ" => "-・-- ・・","ご" => "---- ・・", "ざ" => "-・-・- ・・","じ" => "--・-・ ・・","ず" => "---・- ・・","ぜ" => "・---・ ・・","ぞ" => "---・ ・・", "だ" => "-・ ・・","ぢ" => "・・-・ ・・","づ" => "・--・ ・・","で" => "・-・-- ・・","ど" => "・・-・・ ・・", "ば" => "-・・・ ・・","び" => "--・・- ・・","ぶ" => "--・・ ・・","べ" => "・ ・・","ぼ" => "-・・ ・・", "ぱ" => "-・・・ ・・--・","ぴ" => "--・・- ・・--・","ぷ" => "--・・ ・・--・","ぺ" => "・ ・・--・","ぽ" => "-・・ ・・--・", "ん" => "・-・-・", ); $morusu_kana = array_flip($kana_morusu); $str_kana = $_POST['kana']; $str_morusu = $_POST['morusu']; $array_kana = array(); $array_kana = preg_split("//u", $str_kana, -1, PREG_SPLIT_NO_EMPTY); foreach ($array_kana as $key_kana => $value_kana) { $newphrase_kana[$key_kana] = array_search($value_kana, $morusu_kana); } $view_morusu = implode(" ", $newphrase_kana); if (empty($str_morusu) === false) { $matches_morusu = explode(" ", $str_morusu); } $matches_morusu = array_filter($matches_morusu, "strlen"); $matches_morusu = array_values($matches_morusu); foreach ($matches_morusu as $key => $value) { if ($value === "・・") { $tmp_daku = array(); $tmp_daku = array( $matches_morusu[$key - 1], $matches_morusu[$key] ); $tmp_daku = implode(" ", $tmp_daku); $matches_morusu[$key - 1] = $tmp_daku; $matches_morusu[$key] = ""; } else { if ($value === "・・--・") { $tmp_handaku = array(); $tmp_handaku = array( $matches_morusu[$key - 1], $matches_morusu[$key] ); $tmp_handaku = implode(" ", $tmp_handaku); $matches_morusu[$key - 1] = $tmp_handaku; $matches_morusu[$key] = ""; } } } $matches_morusu = array_filter($matches_morusu, "strlen"); $matches_morusu = array_values($matches_morusu); foreach ($matches_morusu as $key_morusu => $value_morusu) { $newphrase_morusu[$key_morusu] = array_search($value_morusu, $kana_morusu); } $view_kana = implode("", $newphrase_morusu); ?> |
まず配列$kana_morusuのkeyに「ひらがな」、valueに「モールス信号」を格納します。(50音)
配列$morusu_kanaには、逆にkeyに「モールス信号」、valueに「ひらがな」を格納するのですが、array_flip($配列)という便利なphpの関数があったのでこれを使いました。
array_flip — 配列のキーと値を反転する
配列$str_kanaには変換するひらがな、配列$str_morusuには復元するモールス信号が入ります。
【変換】ひらがな→モールス信号
フォームで送信されたひらがなをpreg_split()で一文字ずつばらばらにします。
(「あいう」→「あ」「い」「う」)
下の一行で、phpで日本語(マルチバイト)を含む文字列を一文字ずつ配列に分割させることができます。
1 |
$array_kana = preg_split("//u", $str_kana, -1, PREG_SPLIT_NO_EMPTY); |
(参考:PHPで日本語(マルチバイト)を含む文字列を一文字ずつ配列に分割させる方法)
preg_split — 正規表現で文字列を分割する
ばらばらにしたひらがなをforeachで回して、array_search()で検索し、対応するモールス信号に置き換えます。
(「あ」→「--・--」、「い」→「・-」、「う」→「・・-」)
array_search — 指定した値を配列で検索し、見つかった場合に対応する最初のキーを返す
モールスに信号に置き換えられた文字は随時、配列$newphrase_kanaに格納していきます。
最後に、implode()を使ってモールスに変換された文字同士を半角スペースで連結させます。これが入力したひらがなの変換後の文字として画面に表示させます。
implode — 配列要素を文字列により連結する
【復元】モールス信号→ひらがな
※今回のモールス信号を入力するフォームには、上記ひらがな→モールス信号に変換されたものをペーストすることを前提として作っております。
まず、フォームに入力(ペースト)されたモールス信号を、explode()を使って半角スペースで区切って分解します。
(「--・-- ・- ・・-」→「--・--」「 」「・-」「 」「・・-」)
分解したものを配列$matchs_morusuに格納します。
explode — 文字列を文字列により分割する
配列$matche_morusuに含まれる空の要素を排除します。空の要素はarray_filter($配列, ‘strlen’)で排除できます。排除した後は配列が歯抜けになってしまうので、keyを振り直します。
(「--・--」「 」「・-」「 」「・・-」 → 「--・--」「・-」「・・-」)
(参考:array_filterと無名関数)
(参考:array_filter()とarray_values()を使って配列から空要素を削除して添字をつめる方法)
array_filter — コールバック関数を使用して、配列の要素をフィルタリングする
array_values — 配列の全ての値を返す
foreachでまわして、何も無ければひらがなに変換しますが、もしvalueに濁点(・・)と半濁点(・・–・)があると、1つ前の文字と半角スペースでつないで合体させます。
(「・-・・(か)」「・・(゛)」「-・-・・(き)」「・・(゛)」「・・・-(く)」「・・(゛)」)
復元したひらがなを表示させます。
いかがでしょうか。今回は50音にモールス信号を対応させましたが、自分独自の言葉や記号を設定すれば自分だけの変換機が作れます。みなさんもぜひこの機会にオリジナルの魔術書を作ってみてください(▽・x・▽)
・-・・・ ・-・ ・-・・ ---・- ・- -・