화면을 통해서도 내 터미널이 지원하는 유니코드의 양을 감지합니다.

화면을 통해서도 내 터미널이 지원하는 유니코드의 양을 감지합니다.

문제는 내 터미널이 한눈에 보기, 때로는 색상 및 기타 밑줄과 같은 특정 문자를 사용하기 위해 적절한 유니코드를 사용할 수 있는지 알 수 있기를 원한다는 것입니다.

모든 종류의 가상 터미널에서 괜찮은 글꼴을 얻을 수 있었기 때문에 동기가 부여되었지만 기본 Linux 콘솔에는 256 또는 512 동시 기호의 문자 집합이 있으므로 전체 글꼴 지원을 기대할 수 없다는 것을 알고 있었습니다.

처음에는 $TERM또는 tty를 사용할 수 있다고 생각했지만 문제는 다음과 같습니다. byobu도 사용하고 있으므로 $TERM항상 "screen.linux"입니다. tty의 출력은 /dev/pts/<some number>"실제"도 가상도 아닙니다.

$BYOBU_TTY/dev/tty1예를 들어 ++ 에서 세션을 열 때 문자가 표시되지 않지만 일부 X 용어에서 동일한 세션에 연결되면 올바르게 표시되지만 여전히 표시되지 않기 때문에 도움이 되지 않습니다. 변하지 않아. 또한 byobu가 존재하는지 여부를 가정하지 않고도 이를 감지할 수 있기를 바랍니다.CtrlAltF1$BYOBU_TTY

또한 로케일은 모든 경우에 en_US.UTF-8을 표시합니다.

그러나 어떻게든 byobu 내에서도 byobu 세션에 연결된 터미널에 따라 다른 출력이 사용됩니다(이를 감지한 특정 도구의 이름을 지정하기 위해).

터미널과 tty가 너무 흔한 검색어인 것 같아서 Google을 사용하는 데 어려움을 겪고 있습니다. 내가 생각해 낼 수 있는 가장 좋은 것은 권장되는 솔루션 $TERM이나 tty 솔루션입니다.

답변1

글쎄요, 먼저 요즘 거의 모든 터미널이 당신이 의미하는 의미에서 "가상"이라는 점을 지적하고 싶습니다. 터미널이 실제 직렬 포트의 반대편에 있더라도 마찬가지입니다. 내 말은, 그 시절이었어VT-100에스,지혜터미널과 기타 "물리적", "실제" 터미널은 거의 사라졌습니다!

그 외에도 터미널이 지원하는 유니코드를 검색하고 싶다고 가정해 보겠습니다. is에 테스트 문자를 작성하고 무슨 일이 일어나는지 확인하면 됩니다. (테스트 문자를 작성한 후 지우려고 시도할 수 있지만 사용자에게 여전히 잠깐 표시되거나 지우기가 처음에 제대로 작동하지 않을 수 있습니다.)

아이디어는 터미널에 커서 위치를 알려달라고 요청하고, 테스트 문자를 출력하고, 터미널에 다시 위치를 알려달라고 요청한 다음 두 위치를 비교하여 터미널의 커서가 얼마나 이동했는지 확인하는 것입니다.

터미널 위치를 문의하려면 다음을 참조하세요.여기. 기본적으로:

echo -e "\033[6n"; read -d R foo; echo -en "\nCurrent position: "; echo $foo | cut -d \[ -f 2

"é"를 출력해 보세요. 이 문자는 UTF-8에서 2바이트를 차지하지만 화면에서는 한 열에만 나타납니다. "é"를 출력하면 커서가 두 위치 이동하는 것을 감지하면 터미널이 UTF-8을 전혀 지원하지 않으며 아마도 일종의 쓰레기를 출력하고 있는 것일 수 있습니다. 커서가 전혀 움직이지 않는다면 터미널은 아마도 ASCII 전용일 것입니다. 1자리 이동하면 축하합니다. 프랑스어 단어가 표시될 수도 있습니다.

"あ"를 출력해 보세요. 이 문자는 UTF-8에서 3바이트를 차지하지만 화면에서는 두 개의 열로만 나타납니다. 커서가 0이나 3만큼 움직이면 위와 비슷한 나쁜 소식이 있는 것입니다. 1씩 이동하면 터미널이 UTF-8을 지원하는 것처럼 보이지만 와이드 문자(고정 폭 글꼴)에 대해서는 인식하지 못하는 것입니다. 2개의 열을 이동하면 모든 것이 정상입니다.

유용한 정보를 가져올 다른 프로브 캐릭터를 보내실 수 있을 거라 확신합니다. 이 작업을 자동으로 수행할 수 있는 도구는 없습니다.

답변2

OP의 실제 질문은 Linux 콘솔에서 어떤 유니코드 값을 지원하는지, 그리고 screen원칙적으로 콘솔의 유니코드 매핑을 검색하여 이를 수행할 수 있다는 것입니다.

소스 kbd트리에는 다음이 포함됩니다.getunimap(및 맨 페이지). 맨 페이지에는 다음과 같은 내용이 있습니다.

getunimap 프로그램은 오래되었고 더 이상 사용되지 않습니다. 이제 setfont의 일부입니다.

이것은 완전히 정확하지 않습니다. setfont다음과 같은 옵션이 있습니다.같은 것:

   -ou file                                  
          Save previous Unicode map in file

차이점:

  • setfont파일과 getunimap표준 출력에 쓰기
  • getunimap코멘트로 매핑할 문자를 표시합니다.

예를 들어:

0x0c4   U+2500  # ─ 
0x0c4   U+2501  # ━ 
0x0b3   U+2502  # │ 
0x0b3   U+2503  # ┃ 
0x0da   U+250c  # ┌ 
0x0da   U+250d  # ┍ 
0x0da   U+250e  # ┎ 
0x0da   U+250f  # ┏ 
0x0bf   U+2510  # ┐ 
0x0bf   U+2511  # ┑ 
0x0bf   U+2512  # ┒ 
0x0bf   U+2513  # ┓ 
0x0c0   U+2514  # └ 
0x0c0   U+2515  # ┕ 
0x0c0   U+2516  # ┖ 
0x0c0   U+2517  # ┗ 

비교적

0xc4    U+2500
0xc4    U+2501
0xb3    U+2502
0xb3    U+2503
0xda    U+250c
0xda    U+250d
0xda    U+250e
0xda    U+250f
0xbf    U+2510
0xbf    U+2511
0xbf    U+2512
0xbf    U+2513
0xc0    U+2514
0xc0    U+2515
0xc0    U+2516
0xc0    U+2517

달리고 있는 경우 screen(예: xterm달리고아니요콘솔에서) 권한 오류가 발생하며 이를 사용하여 해결할 수 있습니다 sudo.

어떤 글꼴이 로드되었는지 알게 되면 다음 명령을 사용하여 확인할 수 있습니다. (특별한 권한은 필요하지 않습니다.)psfgettable,예를 들어,

zcat /usr/share/consolefonts/Lat2-Fixed16.psf.gz | psfgettable -

그리고 글꼴을 로드하는 데 사용된 매핑 데이터를 봅니다 setfont(유니코드 매핑 사용).

#
# Character table extracted from font -
#
0x000   U+00a9
0x001   U+00ae
0x002   U+00dd
0x003   U+0104
0x004   U+2666 U+25c8 U+fffd
0x005   U+0105
0x006   U+0111
0x007   U+0150
0x008   U+0151
0x009   U+0162
0x00a   U+0164
0x00b   U+0170
0x00c   U+0171
0x00d   U+021a 
0x00e   U+02dd  
0x00f   U+2014 U+2015
0x010   U+2020
0x011   U+2021
0x012   U+2022 U+25cf
...

getunimap둘 다 정렬된 setfont것처럼 보이지만 정렬되지 않은 데이터를 제공합니다 psfgettable(동일한 문자 모양에 매핑되는 유니코드 값 행을 결합하는 것도 포함). 따라서 차이점이 있지만 정보에 접근할 수 있습니다.

showconsolefont추가 자료( 이 문제를 해결하기 위해 이것을 사용할 수 없는 이유를 설명하십시오 ):

답변3

동일한 작업을 수행하려고 했으나 화면에 아무것도 남기고 변수를 설정하고 싶지 않았기 때문에 이 문제가 발생했습니다. 그래서 소스로 제공한 쉘 스크립트에 다음을 넣었습니다.

function test_unicode {
  echo -ne "\xe2\x88\xb4\033[6n\033[1K\r"
  read -d R foo
  echo -ne "\033[1K\r"
  echo -e "${foo}" | cut -d \[ -f 2 | cut -d";" -f 2 | (
    read UNICODE
    [ $UNICODE -eq 2 ] && return 0
    [ $UNICODE -ne 2 ] && return 1
  )
}

test_unicode
RC=$?
export UNICODE_SUPPORT=`[ $RC -eq 0 ] && echo "Y" || echo "N"`
unset test_unicode

관련 정보