На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила трёх "С"
Пожалуйста,
1. Соблюдайте правила Форума.
2. Слушайте советы Модераторов.
(например, http://forum.sources.ru/index.php?act=ST&f=7&t=80382 )
3. Сверяйтесь с учебником по Великому и Могучему
  
> Проблема с кириллицей при использовании Curses::UI под FreeBSD 14
    Нужно было сделать небольшой интерфейс с помощью Curses::UI.

    Я набросал небольшой пример на Perl5:

    ExpandedWrap disabled
      use strict;
      use warnings;
      use utf8;
      use Term::ReadKey;
      use Curses::UI;
      use POSIX qw(setlocale LC_ALL);  # Импортируем setlocale и LC_ALL
      use open qw(:std :encoding(UTF-8));
       
      # Устанавливаем локаль для поддержки кириллицы
      setlocale(LC_ALL, "ru_RU.UTF-8");
       
      binmode STDERR, ':encoding(UTF-8)';
      binmode STDOUT, ':encoding(UTF-8)';
       
      # Создаем объект интерфейса
      my $cui = Curses::UI->new(-color => 1);
       
      # Получаем размеры терминала
      my ($max_x, $max_y) = GetTerminalSize(); # Устанавливаем размеры окна
       
      # Вычисляем координаты для центрирования окна
      my $start_y = int(($max_y - 25) / 2);
      my $start_x = int(($max_x - 80) / 2);
       
      # Создаем окно
      my $window = $cui->add(
          'main_window',
          'Window',
          -border => 1,
          -title  => 'Центрированное окно',
          -width  => 80,
          -height => 25,
          -y      => $start_y,
          -x      => $start_x,
      );
       
      # Создаем список элементов
      my @items = ("Элемент 1", "Элемент 2", "Элемент 3", "Элемент 4", "Элемент 5",
                   "Элемент 6", "Элемент 7", "Элемент 8", "Элемент 9", "Элемент 10",
                   "Элемент 11", "Элемент 12", "Элемент 13", "Элемент 14", "Элемент 15");
       
      # Добавляем список в окно
      $window->add(
          'item_list',
          'Listbox',
          -values => \@items,
          -label  => 'Выберите элемент:',
          -width  => 78,  # Ширина списка
          -height => 20,  # Высота списка
          -onchange => sub {
              my $selected_item = $window->get('item_list')->get();
              $cui->message('Выбранный элемент', "Вы выбрали: $selected_item");
          },
      );
       
      # Запускаем интерфейс
      $cui->set_binding(sub { exit }, 'q');  # Выход по нажатию 'q'
      $cui->mainloop();

    Все это делал под FreeBSD 14.1. И замечаю, что часть русского текста выводится "битой", вот скрин:

    user posted image

    Эксперименты с локалями и бубнами не помогли. Решил посмотреть как это работает на других моих системах, которые я изредка пользую. Точно такую же картину получил на предыдущей версии FreeBSD 14.0 и на Linux Debian. Один в один. Да, все эти системы предварительно полностью обновил на сегодняшнее утро.

    FreeBSD freebsd-14.1 14.1-RELEASE-p4 FreeBSD 14.1-RELEASE-p4 GENERIC amd64
    FreeBSD freebsd-14 14.0-RELEASE-p10 FreeBSD 14.0-RELEASE-p10 #0: Wed Sep 4 08:24:14 UTC 2024 GENERIC amd64
    Linux debian-pc 6.1.0-25-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.106-3 (2024-08-26) x86_64 GNU/Linux

    А вот ArchLinux и Linux Manjaro порадовали - там всё ровно получилось!

    Linux archlinux-pc 6.10.8-arch1-1 #1 SMP PREEMPT_DYNAMIC Wed, 04 Sep 2024 15:16:37 +0000 x86_64 GNU/Linux
    Linux majestio-pc 6.6.47-1-MANJARO #1 SMP PREEMPT_DYNAMIC Mon Aug 19 09:51:26 UTC 2024 x86_64 GNU/Linux


    user posted image

    Вопрос: по сути очевидный - "куда копать"?

    Мне вообще-то нужно только под FreeBSD. Я понимаю, что можно легко отказаться от русского языка, сделать на английском. Но не хочется от проблем убегать. Есть какие мысли?
      Судя по тому, что проблемы только с буквами 'т' и 'р' надо смотреть в настройках системы (конфигах терминала). Это точно не кодировка текста. Кодировка обычно ломает весь набор символов, а не пару отдельных букв.

      Попробуйте в окно вывести весь алфавит в верхнем и нижнем регистре.
      Сообщение отредактировано: macomics -
        Цитата macomics @
        Попробуйте в окно вывести весь алфавит в верхнем и нижнем регистре.

        Чисто Перлом, без ncurses, в терминале выводится всё норм:

        ExpandedWrap disabled
          А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я
          а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я


        Добавлено
        Нашел топик, у товарища под Mac OSX похожая проблема.
          А если через ncurses. Поняв набор символов, которые выводятся не правильно, возможно, сможем найти проблему.

          Прикреплённый файлПрикреплённый файлScreenshot_20240907_074955.png (70,34 Кбайт, скачиваний: 20)
          Даже если посмотреть на UTF-8 русский алфавит в hex - там нет и намека на символы ' @' и ' B'. Т.е. даже если символы не верно расшифрованы, тогда не должно было появится таких хвостов.

          Дальше я могу предположить, что проблема с сохранением текста в редакторе (см. hexdump текста исходника)
          Сообщение отредактировано: macomics -
            Цитата macomics @
            А если через ncurses.

            Так дело видать все в нём. Его сильно переделывали последнее время, много функций повырезали. Видать и с кодировкой намутили. А Curses:UI на нём базируется - считай обёртка. Буду ждать обновы Фряхи.

            Цитата macomics @
            Дальше я могу предположить, что проблема с сохранением текста в редакторе (см. hexdump текста исходника)

            Нет, тут все ровно. Если в "сыром" перловом скрипте всё выводит ровно, значит редактор не виноват.
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0252 ]   [ 16 queries used ]   [ Generated: 11.12.24, 15:43 GMT ]