Вставка двоичных данных в терминал Unicode

Мне нужно иметь возможность вставлять двоичные данные в терминал. По какой-то причине каждый байт вне диапазона ASCII ( 0x800xff ) вставлен как 0xff и та же последовательность из трех байтов 0xef 0xbf 0xbd .

Например:

 $ echo -en "\x80" | xclip $ hd <paste><EOF> 00000000 ef bf bd |...| 00000004 

Это имеет какое-то отношение к кодировке символов, используемой терминалом, поскольку, если я изменю ее с UTF-8 на ISO 8859 или аналогично, каждый символ расширенного диапазона будет переведен в 0x3f .

Кто-нибудь знает, как вставить произвольные двоичные данные в терминал?

Изменить: похоже, это очень зависит от терминала. Пример выше находится в Konsole. Я получаю желаемое поведение в xterm, а Gnome Terminal не позволяет вставлять символы в расширенный диапазон вообще. Любое решение Konsole будет по-прежнему оценено.

  • Как изменить монитор, на котором отображается TTY?
  • Не удается удалить ttyS0 из / etc / securetty
  • Всплеск Плимута не работает и вызывает проблемы VT
  • Гармонический шрифт на tty1 (но не tty2-6) после загрузки
  • Debian chroot блокирует PTTY на хосте
  • Как войти в систему пользователя tty из ssh?
  • Выполнение обратной задачи последовательно выполняется для нескольких Unices с xterm
  • Что должны делать интерактивные оболочки в сиротских группах процессов?
  • 4 Solutions collect form web for “Вставка двоичных данных в терминал Unicode”

    ef bf bd – это кодировка UTF-8 символа ЗАМЕНЫ ( ), которая «используется для замены входящего символа, значение которого неизвестно или непредставимо в Unicode».

    То, что вы описываете, не является «расширенным ASCII», а скорее двоичными данными. Некоторые байты в диапазоне 0x800xff не соответствуют действительности ISO 8859, поэтому понятно, что некоторые программы рассматривают это как неизвестный символ.

    Вы можете попробовать использовать 8-битную кодировку символов, которая использует все 255 позиций, таких как кодовая страница IBM 850.

    Но тогда программа, из которой вы копируете, может также интерпретировать данные. И что происходит, когда вы вставляете нулевой байт или escape-последовательность терминала? Весь подход, похоже, обречен на провал.

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

    Исключением является режим term Emacs (или один из его вариантов), который обрабатывает вставленные данные в виде исходного текста, который передается в приложение.

    Нормальным методом предоставления двоичного ввода в приложение было бы перенаправление его ввода из файла или канала. Если данные находятся в буфере обмена X, вы можете использовать xclip или xsel :

     xclip -o | myapp xsel -o | myapp 

    Ожидаемое поведение работало здесь, используя терминал yakuake . Я сделал echo -en "\x5" | xclip echo -en "\x5" | xclip а затем средняя кнопка нажата на сеанс экрана с открытым портом. Устройство повторилось так, как ожидалось.

    Есть несколько комментариев, которые не получили подходящего ответа. Вот несколько моментов:

    • xterm не принимает «произвольные двоичные данные». Он принимает (в зависимости от локали) UTF-8 или ISO-8859-1. Последнее следует ICCM, первое – расширение от XFree86. В любой кодировке xterm может интерпретировать эти символы для (попытки) предоставить данные из выделения. Если при вставке текста UTF-8 из выбора в кодировку ISO-8859-1, он будет приближаться к наиболее часто используемым символам (включая рисование линий).

    • выбор (и вставка) зависит как от источника (где производится выбор), так и от цели (где текст вставлен). Оба должны согласовать формат данных для выбора / вставки. xterm предоставляет и принимает несколько форматов (см. button.c в источниках ). Консоль и гном-терминал используют меньше форматов.

    • Например, Konsole делает выбор X11 в качестве запоздалой мысли. Он использует метод QClipboard::Selection . Комментарии к Qt в разделе Заметки для пользователей X11 интересны в этом отношении. Но прочитайте код и убедитесь, что он поддерживает только COMPOUND_TEXT :

       if (*format == 8 && *type == ATOM(COMPOUND_TEXT)) { // convert COMPOUND_TEXT to a multibyte string XTextProperty textprop; textprop.encoding = *type; textprop.format = *format; textprop.nitems = buffer_offset; textprop.value = (unsigned char *) buffer->data(); char **list_ret = 0; int count; if (XmbTextPropertyToTextList(display, &textprop, &list_ret, &count) == Success && count && list_ret) { offset = buffer_offset = strlen(list_ret[0]); buffer->resize(offset); memcpy(buffer->data(), list_ret[0], offset); } if (list_ret) XFreeStringList(list_ret); } 
    • Аналогично, VTE GNOME использует gtk_clipboard_get_for_display , обычно следуя примеру Qt.

    • IBM 850 представляет собой 8-битное кодирование (например, ISO-8859-1) и не может представлять символ замены UTF-8. Итак, ваш терминал использует ? ( символ по умолчанию ).

    Дальнейшее чтение:

    • Почему я не могу выбрать / вставить в / из других программ? (xterm FAQ)

    • Символ по умолчанию – это не всегда знак вопроса

    Linux и Unix - лучшая ОС в мире.