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


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
...

둘 다 getunimapsetfont동시에 정렬되지 않은 데이터를 제공 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.