Так как раскладка клавиатуры является свойством устройства ввода данных, через которое Вы могли установить ее xinput
. Использовать xbindkeys
определить произвольный X горячих клавиш.
ef bf bd
кодировка UTF-8 СИМВОЛА ЗАМЕНЫ (�), который "используется для замены входящего символа, значение которого является неизвестным или непредставимым в Unicode".
То, что Вы описываете, не является "расширенным ASCII", а скорее двоичными данными. Некоторые байты в диапазоне 0x80
-0xff
не допустимый ISO 8859 ничто, таким образом, понятно что некоторая обработка программ что как неизвестный символ.
Вы могли попытаться использовать 8-разрядную кодировку символов, которая использует все 255 положений, таких как кодовая страница 850 IBM.
Но затем программа, с которой Вы копируете, могла бы интерпретировать данные также. И что происходит, когда Вы вставляете пустой байт или терминальную escape-последовательность? Целый подход кажется предназначенным для сбоя.
Терминалы обычно не разрабатываются для принятия двоичного входа: они ожидают, что управляющие символы будут иметь особое значение в приложениях и сделают некоторую обработку самих управляющих символов (главным образом в несколько сигналов).
Исключением является Emacs term
режим (или один из его вариантов), который рассматривает вставляемые данные как необработанный текст, это передается приложению.
Нормальный метод обеспечения двоичного входа к приложению должен был бы перенаправить свой вход из файла или канала. Если данные находятся в X буферах обмена, можно использовать xclip
или xsel
:
xclip -o | myapp
xsel -o | myapp
cat pipe - | myapp
. Но так как это предназначено, чтобы быть демонстрацией для людей, у которых не обязательно есть фон программирования, я хотел сохранить его максимально простым и просто найти способ вставить двоичные данные в терминале.
– Job
26.06.2012, 09:32
Ожидаемое поведение работало здесь с помощью yakuake терминал. Я сделал echo -en "\x5" | xclip
и затем щелкнутый средней кнопкой на экранную сессию с последовательным портом, открытым на нем. Устройство, отраженное столь же ожидаемый.
Есть несколько комментариев, которые не получили подходящего ответа. Вот некоторые моменты:
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. Поэтому ваш терминал использует ?
(символ по умолчанию).
Дальнейшее чтение:
0x3f
. – Job 26.06.2012, 09:34