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


10

문제가 있습니다 : 터미널에서 적절한 유니 코드를 사용할 수 있는지 여부를 알 수 있기를 원합니다. 일부 문자와 비슷하게 눈에 띄는 것처럼 때로는 색상과 다른 밑줄을 사용합니다.

모든 종류의 가상 터미널에서 적절한 글꼴을 얻었 기 때문에 동기 부여가 발생하지만 기본 Linux 콘솔에는 256 또는 512 개의 동시 기호 문자 세트가 있으므로 완전한 글꼴 지원을 기대할 수 없습니다.

처음에는 내가 사용 $TERM하거나 tty를 사용할 수 있다고 생각 했지만 여기에 캐치 $TERM가 있습니다. byobu 도 사용하고 있으므로 항상 "screen.linux"입니다. tty의 결과는 /dev/pts/<some number>"실제"와 가상의 용어 로도 잘 알려져 있지 않습니다 .

$BYOBU_TTY예를 들어 /dev/tty1세션이 Ctrl+ Alt+ 로 열릴 때 F1문자가 표시되지 않지만 일부 X 용어에서 동일한 세션에 첨부 할 때 올바르게 표시되고 여전히 $BYOBU_TTY변경되지 않기 때문에 도움이되지 않습니다. 게다가 byybu가 있다고 가정하지 않고 이것을 감지하고 싶습니다.

또한 로케일은 모든 경우에 en_US.UTF-8을 보여줍니다.

그러나 byobu 내부에서도조차도 byobu 세션에 연결하는 터미널에 따라 다른 출력을 사용합니다.

터미널과 tty가 너무 일반적인 검색어처럼 보이므로 Google에 문제가 있습니다. 기껏해야 솔루션 추천 $TERM또는 tty에 도착 합니다.

답변:


6

글쎄, 먼저, 나는 요즘 거의 모든 터미널이 당신이 말하는 의미에서 "가상"이라고 지적 할 것입니다. 터미널이 실제 직렬 포트의 다른 쪽 끝에 있더라도 말입니다. VT-100 , Wyse 터미널 및 기타 "물리적", "실제"터미널 의 시대 는 거의 사라졌습니다.

그 외에도, 터미널이 어떤 종류의 유니 코드를 지원하는지 감지하고 싶다고 가정 해 봅시다. 테스트 문자를 작성하고 무슨 일이 일어나는지 확인하면됩니다. (작성한 후에 테스트 문자를 지우려고 노력할 수 있지만 사용자가 여전히 짧은 시간 동안 문자를 보거나 지우는 것이 처음에는 제대로 작동하지 않을 수 있습니다.)

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

터미널의 위치를 ​​물어 보려면 여기를 참조 하십시오 . 본질적으로 :

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

"é"를 출력 해보십시오. 이 문자는 UTF-8에서 2 바이트를 사용하지만 화면에서 하나의 열에 만 표시됩니다. "é"를 출력하면 커서가 2 개의 위치로 이동하는 것을 감지하면 터미널은 전혀 UTF-8을 지원하지 않으며 아마도 어떤 종류의 가비지를 출력했을 것입니다. 커서가 전혀 움직이지 않으면 터미널은 아마도 ASCII 일 것입니다. 1 자리 이동 한 후 축하합니다. 프랑스어 단어가 표시 될 수 있습니다.

"あ"를 출력 해보십시오. 이 문자는 UTF-8에서 3 바이트를 사용하지만 화면에서 두 개의 열에 만 표시됩니다. 커서가 위와 유사하게 0 또는 3만큼 이동하면 나쁜 소식입니다. 1만큼 이동하면 터미널이 UTF-8을 지원하지만 와이드 문자 (고정 폭 글꼴)에 대해서는 알지 못하는 것 같습니다. 2 열씩 움직이면 모두 좋습니다.

유용한 정보로 이어질 수있는 다른 프로브 문자가 있다고 확신합니다. 나는 이것을 자동으로 수행하는 도구를 모른다.


1
제안 해 주셔서 감사합니다, 셀라 다 그러나, 그것은 작동하지 않습니다 : 나는 위치가 앞선 것으로보고되었습니다 (é의 경우 1, あ의 경우 2). 유일한 차이점은 XI1에서 실제 문자를 보는 반면 tty1에서는 다이아몬드를 보는 것입니다. 따라서 터미널이 실제로 utf-8을 지원하지만 사용되는 글꼴의 문자가 부족합니다.
— Álex

이제 showconsolefont 명령을 보았습니다. 이것은 가능한 해결책처럼 보였습니다 (-v를 사용하면 글꼴이 512 문자 집합이라고보고합니다). 안타깝게도 byobu를 사용하지 않을 때만 작동합니다. 이 마지막 경우 "콘솔을 참조하는 파일 디스크립터를 얻을 수 없습니다"라는 오류가 발생합니다. tty (-C 옵션)를 명시 적으로 전달하면 오류는 "/ dev / pts / 37을 열 수 없습니다"
— Álex

그런데 : SH 스크립트 문자열의 단자 폭을 결정하는 (하지만이 게 아니에요 이 질문에 관한 것입니다)
— 질 'SO-정지되는 악'

3

OP의 실제 질문은 Linux 콘솔이 지원하는 유니 코드 값이며 실행 중에 감지 될 수있는 것 screen입니다. 원칙적으로 콘솔의 유니 코드 맵을 검색하여이를 수행 할 수 있습니다.

kbd소스 트리가 포함 getunimap(과 매뉴얼 페이지). 매뉴얼 페이지는 말합니다

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

정확히 사실이 아닙니다. 대략 같은 일 setfont을하는 옵션이 있습니다 :

   -ou file                                  
          Save previous Unicode map in file

차이점들:

  • setfontgetunimap표준 출력에 쓰는 동안 파일에 쓴다
  • 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이 문제를 해결하는 데 사용할 수없는 이유 설명 ) :


토마스, 내 원래의 질문을 명확하게 해준 것에 대해 설명해 주셔서 감사합니다. 나는 당신의 정보에서 간단한 원 라이너를 얻으려고 노력하고 결과로 돌아올 것입니다. 사용 sudo은 나의 사용 사례에 방해가되지 않습니다.
— Álex

이제는 궁금합니다. setfont가상 터미널 내에서 아무것도 출력하지 않고 (주어진 파일을 만들거나 오류를 출력하지는 않지만) 예상대로 실제 터미널에서 작동합니다. 이것은 우분투 16.04에
— 알렉스

2

나는 똑같은 일을 성취하려고 노력 하면서이 질문을 보았지만 화면에 아무것도 남기고 변수를 설정하지 않기를 원했기 때문에 다음을 소스 쉘 스크립트에 넣었습니다.

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

1
기부 해 주셔서 감사합니다, Jeff. 슬프게도 나는 기본 콘솔에서도 항상 Y를 얻습니다 : S
— Álex
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.