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

Так как раскладка клавиатуры является свойством устройства ввода данных, через которое Вы могли установить ее xinput. Использовать xbindkeys определить произвольный X горячих клавиш.

3
26.06.2012, 02:50
4 ответа

ef bf bd кодировка UTF-8 СИМВОЛА ЗАМЕНЫ (�), который "используется для замены входящего символа, значение которого является неизвестным или непредставимым в Unicode".

То, что Вы описываете, не является "расширенным ASCII", а скорее двоичными данными. Некоторые байты в диапазоне 0x80-0xff не допустимый ISO 8859 ничто, таким образом, понятно что некоторая обработка программ что как неизвестный символ.

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

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

3
27.01.2020, 21:13
  • 1
    Это звучит разумным, но почему затем это работает в xterm? –  Job 25.06.2012, 20:48
  • 2
    , что я предполагаю, что это проходит через нераспознанные данные вместо того, чтобы пытаться интерпретировать его. –  Mikel 26.06.2012, 00:06
  • 3
    IBM 850 также, кажется, переводит те "высокие" байты в 0x3f. –  Job 26.06.2012, 09:34

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

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

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

xclip -o | myapp
xsel -o | myapp
2
27.01.2020, 21:13
  • 1
    Проблема состоит в том, что обеспечив двоичные данные, программа признает, что обычный пользователь ввел снова. Этим можно заняться при помощи именованных каналов, чего-то как cat pipe - | myapp. Но так как это предназначено, чтобы быть демонстрацией для людей, у которых не обязательно есть фон программирования, я хотел сохранить его максимально простым и просто найти способ вставить двоичные данные в терминале. –  Job 26.06.2012, 09:32

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

1
27.01.2020, 21:13
  • 1
    , пример, используемый в этом ответе, не рассматривает вопрос; это использует код, который является нормальным ASCII, не включает кодировку UTF-8. –  Thomas Dickey 16.06.2016, 11:13

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

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

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

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

    if (*format == 8 && *type == ATOM(COMPOUND_TEXT)) { // преобразование COMPOUND_TEXT)
     // преобразуем COMPOUND_TEXT в многобайтовую строку
     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. Поэтому ваш терминал использует ? (символ по умолчанию).

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

1
27.01.2020, 21:13

Теги

Похожие вопросы