Хобрук: Ваш путь к мастерству в программировании

Как поддерживать расширенные символы curses с помощью PuTTY

Я создаю программу curses, которая должна использовать специальные символы прямоугольника (, , и т. д.), которые можно найти здесь. Я подключаюсь к серверу Linux, где я программирую с помощью PuTTY. Когда я просто устанавливаю границу curses по умолчанию (screen.border(0)), граница состоит из символов алфавита (q, l, m, x). Это нормально?

Символы curses.ACS_* также являются просто буквами алфавита на моем экране. Я не знаю, что не так, но я предполагаю, что это может быть как-то связано с PuTTY. Я даже пытался напрямую вставлять символы в строку, но есть много проблем с юникодом, которые я не могу исправить.

Любая помощь приветствуется. -=m0dem=-

РЕДАКТИРОВАТЬ: приведенный ниже пример сценария - это то, что я пробовал, и он не работает.

#!/usr/bin/python
import curses
import os

os.environ["NCURSES_NO_UTF8_ACS"] = "1"
screen = curses.initscr()

screen.clear()
screen.refresh()
screen.border(0)
# catch
screen.getch()
curses.endwin()

Ответы:


1

Проблема в том, что по умолчанию ncurses предполагает, что в описании терминала указаны символы рисования линий (которые соответствуют VT100). xterm реализует это, но некоторые разработчики предпочли игнорировать escape-последовательности для этого в режиме UTF-8.

Вместо того, чтобы делать специальные случаи для каждого терминала ("linux" и "screen" было достаточно), ncurses проверяет переменную окружения NCURSES_NO_UTF8_ACS (установленную в ненулевое значение), чтобы сообщить ему, что в режиме UTF-8 он должен игнорировать описание терминала. и просто используйте константы UTF-8.

Это находится в часто задаваемых вопросах по ncurses. >, а также на странице руководства< /а>.

Эти функции необходимы для того, чтобы переменная среды работала, как описано:

  • Python должен быть настроен для использования расширенной версии ncurses ("ncursew").
  • ваша кодировка локали должна быть UTF-8
  • переменная окружения NCURSES_NO_UTF8_ACS должна иметь ненулевое значение.

Я смог протестировать данный скрипт на машине с Debian 6 (несколько лет), где Python настроен на использование ncursesw, и с моей локалью, установленной следующим образом:

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_ALL=en_US.UTF-8

Поскольку ncurses использует nl_langinfo(CODESET), если они доступны, у него достаточно надежная проверка кодировки UTF-8. . Слабым местом могут быть какие-то странные пакеты Python (не упоминается ни платформа, ни версия Python).

Python выбирает тип ncurses/ncursew в setup.py; переопределение этого в пользовательском сценарии, вероятно, невозможно. Одна из причин, по которой он может использовать ncurses, а не ncursesw, связана с конфликтом с библиотекой readline, которая должна быть скомпилирована для использования ncurses или ncursesw. Упаковка низкоуровневых функций ncurses/ncursew в виде общей библиотеки «tinfo» может помочь упаковщикам решить эту проблему, но не все воспользовались этим преимуществом. Вот несколько ссылок, которые дают некоторое представление:

29.04.2015
  • Даже если я добавлю os.environ["NCURSES_NO_UTF8_ACS"] = "1" в начале, он все равно не использует символы рамки в качестве границы. 30.04.2015
  • Если вы предоставите полный рабочий сценарий, люди смогут протестировать его и прокомментировать. 30.04.2015
  • Как именно вы настраиваете Python для использования ncursesw? И еще, у меня нет root-доступа на этом сервере. 30.04.2015
  • Это Python 2.7.8 в Fedora. Есть ли версия Python 2, в которой ncursesw установлено по умолчанию (вместо ncurses)? 30.04.2015
  • Ваши ссылки на отчет об ошибках Redhat и отчет об ошибках Python показывают, что обе ошибки исправлены по состоянию на 2007 год. И ошибки FreeBSD не очень актуальны, так как это Fedora. 01.05.2015
  • Fedora (и Linux в целом) не упоминались ни в исходном вопросе, ни в подразумеваемом вопросе, заданном завершенным образцом сценария. Однако я буду расширять ответ по мере необходимости. 01.05.2015
  • Вы сказали, что протестировали его, но подключались ли вы к PuTTY из Windows? Я думаю, что проблема в PuTTY, так как друг попробовал его с помощью Konsole (из Linux), и скрипт, который не работал у меня, сработал! 01.05.2015
  • Я тестировал с PuTTY, работающим из OSX (это будет вести себя так же, как из Windows, потому что проблема в конечном итоге заключается в том, что PuTTY не соблюдает элементы управления отрисовкой линий VT100, когда его перевод предназначен для UTF-8 - консоль и gnome-терминал будут работать). 01.05.2015
  • Хорошо, не могли бы вы показать мне точный код, который вы использовали? Бесконечно благодарен. :) 02.05.2015
  • Я использовал ваш пример без изменений. 02.05.2015

  • 2

    Я запускал свои сеансы PuTTY в UTF-8, потому что таким образом я не получаю странностей от вывода Linux I8N. Программный инструмент C из библиотеки (SPDK/spdk_top), работающий с curses, выводил буквы вместо символов границ.

    Я обнаружил, что изменение перевода PuTTY на ISO 8859-1 дало мне приятные граничные символы.

    14.08.2020
    Новые материалы

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

    Обзор 20 основных и современных методов работы с массивами в JavaScript
    Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

    Да, но я чувствую необходимость указать, что это или не единственные два.
    Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.