PHP: русская и английская азбука Морзе для текста в Юникоде
Опять же, не попалось навскидку преобразования русскоязычного Юникод-текста в азбуку Морзе, пришлось
написать небольшой класс. Я не старался учесть все дополнительные символы расширений азбуки Морзе
для разных языков, но с базовым русско- или англоязычным текстом функции справятся. Работа с
Юникодом ведётся корректно,
то есть, с помощью функций, у которых имена начинаются на "mb_
". Интерфейс легко прикрутить самостоятельно.
Две функции класса MorseClass
возвращают строки, являющиеся результатом преобразования текста в "морзянку"
и наоборот. Дополнительный параметр первой функции указывает разделитель слов (по умолчанию '/'
),
а у второй функции дополнительный параметр нужен для уточнения языка (по умолчанию = 0
- русский,
ненулевое значение - английский).
Информация об ошибочных символах пишется в публичную переменную класса $error
, откуда её можно прочитать (если нет ошибочных символов в последнем вызове, то переменная $error
будет пуста).
Листинг нужно сохранять именно в Юникоде, как в прикреплённом внизу страницы архиве, при копировании из блога информация может быть частично потеряна из-за его однобайтовой кодировки. Тем не менее, приведу листинг класса, пример кода для его вызова и результат тестового вызова.
Листинг класса MorseClass
<?php class MorseClass { private static $russian_alphabet = array ( 'А' => '.-', 'Б' => '-...', 'Ц' => '-.-.', 'Д' => '-..', 'Е' => '.', 'Ф' => '..-.', 'Г' => '--.', 'Х' => '....', 'И' => '..', 'Й' => '.---', 'К' => '-.-', 'Л' => '.-..', 'М' => '--', 'Н' => '-.', 'О' => '---', 'П' => '.--.', 'Щ' => '--.-', 'Р' => '.-.', 'С' => '...', 'Т' => '-', 'У' => '..-', 'Ж' => '...-', 'В' => '.--', 'Ь' => '-..-','Ы' => '-.--', 'З' => '--..', 'Ч' => '---.', 'Ш'=>'----', 'Ъ'=>'--·--', 'Э' => '..-..', 'Ю' => '..--', 'Я' =>'.-.-' ); private static $english_alphabet = array ( 'A' => '.-', 'B' => '-...', 'C' => '-.-.', 'D' => '-..', 'E' => '.', 'F' => '..-.', 'G' => '--.', 'H' => '....', 'I' => '..', 'J' => '.---', 'K' => '-.-', 'L' => '.-..', 'M' => '--', 'N' => '-.', 'O' => '---', 'P' => '.--.', 'Q' => '--.-', 'R' => '.-.', 'S' => '...', 'T' => '-', 'U' => '..-', 'V' => '...-', 'W' => '.--', 'X' => '-..-', 'Y' => '-.--', 'Z' => '--..', 'Ö' => '---.', 'Ĥ' => '----', 'Ñ' => '--·--', 'É' => '..-..', 'Ü' => '..--', 'Ä' => '.-.-' ); private static $other_chars = array ( '0' => '-----', '1' => '.----', '2' => '..---', '3' => '...--', '4' => '....-', '5' => '.....', '6' => '-....', '7' => '--...', '8' => '---..', '9' => '----.', '.' => '······', ',' => '·-·-·-', ':' => '---···', ';' => '-·-·-·', '(' => '-.--.', "'" => '.----.', '"' => '.-..-.', '-' => '-....-', '/' => '-..-.', '?' => '..--..', '!' => '--··--', ')' => '-.--.-', '@' => '·--·-·', '&' => '.-...', '=' => '-...-', '+' => '.-.-.', '_' => '..--.-', '$' => '...-..-', //'' => '', "{DIV}"=>'-···-', '{ERROR}'=>'........', '{END}'=>'...-.-' ); public $error; public function text_to_morse ($content, $div='/') { $this->content = mb_convert_case($content,MB_CASE_UPPER,'UTF-8'); $this->error = ''; $words = preg_split("/[\s]+/msiu", $this->content); $outwords = array(); foreach($words as $word) { $bits = array(); $len = mb_strlen($word,'UTF-8'); for($i=0; $i<$len; $i++) { $char = mb_substr($word,$i,1,'UTF-8'); $temp = ''; if (array_key_exists($char,self::$russian_alphabet)) $temp = self::$russian_alphabet[$char]; else if (array_key_exists($char,self::$english_alphabet)) $temp = self::$english_alphabet[$char]; else if (array_key_exists($char,self::$other_chars)) $temp = self::$other_chars[$char]; else $this->error .= $char; if (!empty($temp)) $bits[] = $temp; } $outwords[] = implode(' ', $bits); } return implode(' '.$div.' ', $outwords); } public function morse_to_text ($content, $english = 0) { $this->content = $content; $this->error = ''; $bits = preg_split ("/[\s]+/msiu", $this->content); $outwords = array(); foreach($bits as $bit) { $item = ($english!=0 ? array_search($bit, self::$english_alphabet) : array_search($bit, self::$russian_alphabet)); if ($item === false) { $item = array_search($bit, self::$other_chars); if ($item === false) $this->error .= $bit.' '; else $outwords [] = $item; } else $outwords [] = $item; } return implode(' ', $outwords); } }
Пример скрипта для вызова класса
<?php require_once 'morse.php'; $morse = new MorseClass(); echo $morse->text_to_morse('Нello, world!',' '); echo '<br>'; echo empty($morse->error) ? 'No errors' : 'Errors: '.$morse->error; echo '<br>'; echo $morse->morse_to_text('.... . .-.. .-.. --- ·-·-·- / .-- --- .-. .-.. -.. --··--',1); echo '<br>'; echo empty($morse->error) ? 'No errors' : 'Errors: '.$morse->error; ?>
Результаты вызова
-. . .-.. .-.. --- ·-·-·- .-- --- .-. .-.. -.. --··-- No errors H E L L O , W O R L D ! Errors: /
Скачать скрипт Morse в архиве .zip (2 Кб)
01.02.2017, 17:32 [5058 просмотров]