Вставка двоичных данных в терминал 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 будет по-прежнему оценено.

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)

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

  • В чем разница между этими способами доступа к оболочке?
  • Управление буферизацией чата ppp
  • Проблема tty: двоичный беспорядок вместо «текстовых хороших данных»
  • утечка памяти с помощью сценария оболочки и tty
  • Выполнение обратной задачи последовательно выполняется для нескольких Unices с xterm
  • Графика при загрузке, как backtrack linux или Gentoo live DVD после нажатия alt + F1 при загрузке
  • Может ли эмулятор терминала быть таким же быстрым, как TTY 1-6?
  • dmesg -n7 не действует в виртуальном терминале
  • / dev / console указывает на tty0?
  • Инструмент для просмотра других tty для linux?
  • Почему виртуальный терминал Linux поддерживает только 16 цветов по умолчанию?
  • Linux и Unix - лучшая ОС в мире.