유니코드 터미널에 바이너리 데이터 붙여넣기

유니코드 터미널에 바이너리 데이터 붙여넣기

터미널에 바이너리 데이터를 붙여넣을 수 있어야 합니다. 어떤 이유로 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 bdUTF-8 인코딩인가요?문자 바꾸기(�), "값을 알 수 없거나 유니코드로 표현할 수 없는 들어오는 문자를 대체하는 데 사용됩니다."

당신이 설명하는 것은 "확장 ASCII"가 아니라 이진 데이터입니다. 해당 범위의 일부 바이트는 0x80유효한 0xffISO 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 대체 문자를 표현할 수 없습니다. 따라서 터미널에서는 ?(기본 캐릭터).

추가 자료:

관련 정보