JavaScript で モールス信号変換

JavaScriptでモールス信号(モールス符号)変換プログラムを書きました。


なんでまたモールス信号を?って話なのですが、思いついたので作ってみたというだけで特に意味はありません。


このスクリプトで変換したコードで試せば符号解読の動作は確認できるのですが、自分で変換したものを再変換じゃあ正しい動作なのかってのは微妙ですよね。


しかし、モールス符号で書いてある文章なんてどこにあるんだ……。
って思いながらも探してみたら意外と簡単に見つかりました。

モールス信号 - アンサイクロペディア


アンサイクロペディアのモールス信号のページはモールス信号で書かれています。これをちょいと変換して試してみましょう。

モールスシンコ゛ウトハ、コレノコトテ゛アル」モールスフコ゛ウトイウト、ソレツホ゜クキコエル」アー、ホンシ゛ツハセイテンナリ」


どうやらちゃんと変換できているみたいですねー。



ソースコードは以下に。

var Morse = function() {}

Morse.JToMorse = {
    'イ':'・−',         'ロ':'・−・−',
    'ハ':'−・・・',     'ニ':'−・−・',
    'ホ':'−・・',       'ヘ':'・',
    'ト':'・・−・・',   'チ':'・・−・',
    'リ':'−−・',       'ヌ':'・・・・',
    'ル':'−・−−・',   'ヲ':'・−−−',
    'ワ':'−・−',       'カ':'・−・・',
    'ヨ':'−−',         'タ':'−・',
    'レ':'−−−',       'ソ':'−−−・',
    'ツ':'・−−・',     'ネ':'−−・−',
    'ナ':'・−・',       'ラ':'・・・',
    'ム':'−',           'ウ':'・・−',
    'ヰ':'・−・・−',   'ノ':'・・−−',
    'オ':'・−・・・',   'ク':'・・・−',
    'ヤ':'・−−',       'マ':'−・・−',
    'ケ':'−・−−',     'フ':'−−・・',
    'コ':'−−−−',     'エ':'−・−−−',
    'テ':'・−・−−',   'ア':'−−・−−',
    'サ':'−・−・−',   'キ':'−・−・・',
    'ユ':'−・・−−',   'メ':'−・・・−',
    'ミ':'・・−・−',   'シ':'−−・−・',
    'ヱ':'・−−・・',   'ヒ':'−−・・−',
    'モ':'−・・−・',   'セ':'・−−−・',
    'ス':'−−−・−',   'ン':'・−・−・',
    '゛':'・・',         '゜':'・・−−・',
    'ー':'・−−・−',   '、':'・−・−・−',
    '」':'・−・−・・', '(':'−・−−・−',
    ')':'・−・・−・'
}

Morse.MorseToJ = {
    '・−':'イ',        '・−・−':'ロ',
    '−・・・':'ハ',    '−・−・':'ニ',
    '−・・':'ホ',      '・':'ヘ',
    '・・−・・':'ト',  '・・−・':'チ',
    '−−・':'リ',      '・・・・':'ヌ',
    '−・−−・':'ル',  '・−−−':'ヲ',
    '−・−':'ワ',      '・−・・':'カ',
    '−−':'ヨ',        '−・':'タ',
    '−−−':'レ',      '−−−・':'ソ',
    '・−−・':'ツ',    '−−・−':'ネ',
    '・−・':'ナ',      '・・・':'ラ',
    '−':'ム',          '・・−':'ウ',
    '・−・・−':'ヰ',  '・・−−':'ノ',
    '・−・・・':'オ',  '・・・−':'ク',
    '・−−':'ヤ',      '−・・−':'マ',
    '−・−−':'ケ',    '−−・・':'フ',
    '−−−−':'コ',    '−・−−−':'エ',
    '・−・−−':'テ',  '−−・−−':'ア',
    '−・−・−':'サ',  '−・−・・':'キ',
    '−・・−−':'ユ',  '−・・・−':'メ',
    '・・−・−':'ミ',  '−−・−・':'シ',
    '・−−・・':'ヱ',  '−−・・−':'ヒ',
    '−・・−・':'モ',  '・−−−・':'セ',
    '−−−・−':'ス',  '・−・−・':'ン',
    '・・':'゛',        '・・−−・':'゜',
    '・−−・−':'ー',  '・−・−・−':'、',
    '・−・−・・':'」','−・−−・−':'(',
    '・−・・−・':')','−・・−−−':'[本文]',
    '・・・−・':'[訂正/終了]'
}

Morse.ConvertString = function(cs) {
    cs = cs.replace("ガ", "カ゛").replace("ギ", "キ゛").replace("グ", "ク゛").replace("ゲ", "ケ゛").replace("ゴ", "コ゛");
    cs = cs.replace("ザ", "サ゛").replace("ジ", "シ゛").replace("ズ", "ス゛").replace("ゼ", "セ゛").replace("ゾ", "ソ゛");
    cs = cs.replace("ダ", "タ゛").replace("ヂ", "チ゛").replace("ヅ", "ツ゛").replace("デ", "テ゛").replace("ド", "ト゛");
    cs = cs.replace("バ", "ハ゛").replace("ビ", "ヒ゛").replace("ブ", "フ゛").replace("ベ", "ヘ゛").replace("ボ", "ホ゛");
    cs = cs.replace("パ", "ハ゜").replace("ピ", "ヒ゜").replace("プ", "フ゜").replace("ペ", "ヘ゜").replace("ポ", "ホ゜");
    cs = cs.replace("ァ", "ア").replace("ィ", "イ").replace("ゥ", "ウ").replace("ェ", "エ").replace("ォ", "オ");
    cs = cs.replace("ヵ", "カ").replace("ッ", "ツ").replace("ャ", "ヤ").replace("ュ", "ユ").replace("ョ", "ヨ");
    cs = cs.replace(/(\n|\r)+/g, "」")
    return cs;
}

Morse.JEncode = function(message) {
    var array = Morse.ConvertString(message).split("");
    var ret = new Array();
    for(c in array){
        var m = Morse.JToMorse[array[c]];
        ret.push(m == undefined ? "?":m);
    }
    return ret.join(" ");
}

Morse.JDecode = function(message) {
    // IE系のために全角空白を置き換え
    message = message.replace(/ /g, " ");
    var array = message.replace(/^\s+|\s+$/g, " ").split(/\s+/);
    var ret = new Array();
    for(c in array){
        var m = Morse.MorseToJ[array[c]];
        ret.push(m == undefined ? "?":m);
    }
    return ret.join("");
}

function buttonClick(func) {
    if(document.morse.src.value == "") return false;
    document.morse.dest.value = func(document.morse.src.value);
}
document.write('<form name="morse">');
document.write('<br><textarea id="src" rows="5" cols="50"></textarea>');
document.write('<br>');
document.write('<input type="button" value="カタカナ->モールス符号" onClick="buttonClick(Morse.JEncode)">');
document.write('<input type="button" value="モールス符号->カタカナ" onClick="buttonClick(Morse.JDecode)">');
document.write('<br><textarea id="dest" rows="5" cols="50"></textarea>');
document.write('</form>');