БлогNot. PHP: русская и английская азбука Морзе для текста в Юникоде

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' => '--..', '&#214;' => '---.', '&#292;' => '----', '&#209;' => '--·--', '&#201;' => '..-..', 
  '&#220;' => '..--', '&#196;' => '.-.-'
 );
 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 [5007 просмотров]


теги: программирование язык php

К этой статье пока нет комментариев, Ваш будет первым