터미널에 바이너리 데이터를 붙여넣을 수 있어야 합니다. 어떤 이유로 ASCII 범위( 0x80
- 0xff
)를 벗어난 모든 바이트는 동일한 3바이트 시퀀스로 붙여넣어집니다 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 특정 솔루션은 여전히 높이 평가될 것입니다.
답변1
ef bf bd
UTF-8 인코딩은대체 문자(�)는 "값을 알 수 없거나 유니코드로 표현할 수 없는 입력 문자를 대체하는 데 사용됩니다".
당신이 설명하는 것은 "확장 ASCII"가 아니라 이진 데이터입니다. 범위의 일부 바이트는 0x80
유효한 0xff
ISO 8859가 아니므로 일부 프로그램에서는 이를 알 수 없는 문자로 취급하는 것이 이해됩니다.
IBM 코드 페이지 850과 같이 255개 위치를 모두 사용하는 8비트 문자 인코딩을 사용해 볼 수 있습니다.
하지만 복사 중인 프로그램도 데이터를 해석할 수 있습니다. 널 바이트나 터미널 이스케이프 시퀀스를 붙여넣으면 어떻게 되나요? 전체적인 접근 방식은 실패할 운명인 것 같습니다.
답변2
터미널은 일반적으로 이진 입력을 허용하도록 설계되지 않았습니다. 제어 문자가 응용 프로그램에서 특별한 의미를 갖기를 기대하고 제어 문자 자체를 일부 처리합니다(주로 몇 개의 신호로).
예외는 term
붙여넣은 데이터를 애플리케이션에 전달되는 원시 텍스트로 처리하는 Emacs의 모드(또는 그 변형 중 하나)입니다.
애플리케이션에 바이너리 입력을 제공하는 일반적인 방법은 파일이나 파이프에서 입력을 리디렉션하는 것입니다. 데이터가 X 클립보드에 있으면 xclip
다음을 사용할 수 있습니다 xsel
.
xclip -o | myapp
xsel -o | myapp
답변3
예상되는 동작은 다음을 사용하여 여기에서 작동했습니다.야쿠아케단말기. 완료 echo -en "\x5" | xclip
한 다음 직렬 포트가 열려 있는 스크린 세션에서 가운데 버튼을 클릭했습니다. 예상한 대로 장치가 울렸습니다.
답변4
적절한 답변을 얻지 못한 의견이 여러 개 있습니다. 다음은 몇 가지 사항입니다.
xterm은 "임의의 바이너리 데이터"를 허용하지 않습니다. (로케일에 따라) UTF-8 또는 ISO-8859-1을 허용합니다. 후자는 ICCM을 따르고 전자는 XFree86의 확장입니다. 어느 인코딩에서든 xterm은 이러한 문자를 해석하여 선택 항목의 데이터를 제공할 수 있습니다. 선택 항목의 UTF-8 텍스트를 ISO-8859-1 인코딩으로 붙여 넣으면 가장 일반적으로 사용되는 문자(선 그리기 포함)와 비슷해집니다.
선택(및 붙여넣기)은 소스(선택이 이루어진 위치)와 대상(텍스트를 붙여넣은 위치)에 따라 달라집니다. 둘 다 선택/붙여넣기할 데이터 형식에 동의해야 합니다. xterm은 여러 형식을 제공하고 허용합니다(참조:
button.c
소스에서). Konsole과 gnome-terminal은 더 적은 형식을 사용합니다.예를 들어 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); }
마찬가지로 GNOME의 VTE는 다음을 사용합니다.gtk_clipboard_get_for_display, 일반적으로 Qt의 리드를 따릅니다.
IBM 850은 8비트 인코딩(예: ISO-8859-1)이므로 UTF-8 대체 문자를 표현할 수 없습니다. 따라서 귀하의 터미널은
?
(기본 캐릭터).
추가 자료: