UTF-8 기호를 인쇄하는 방법

UTF-8 기호를 인쇄하는 방법

bash 명령을 사용하여 터미널에 UTF-8 기호를 인쇄하는 방법.

이게 효과가 있어

echo -e '\U2586'

그러나 다음은 실패합니다

printf '%s\n' $(tput setaf 118) "\\u2586" $(tput sgr0)

답변1

printfBash에서 형식 문자열 뒤에 오는 매개변수에서 백슬래시 이스케이프 시퀀스를 확장 하려면 다음 을 수행해야 합니다.사용%b%s형식 문자열 대신 :

printf '%b\n' "$(tput setaf 118)" "\u2586" "$(tput sgr0)"

세 가지 인수가 있으므로 아마도 이것이 더 적절할 수 있습니다.

printf '%s%b%s\n' "$(tput setaf 118)" "\u2586" "$(tput sgr0)"

~처럼스티븐 차제라스이는 현재 로케일의 문자 세트에서 U+2586 문자의 인코딩을 출력합니다. UTF-8인 경우 결과는 UTF-8입니다. 다른 문자 세트는 다양합니다. 문자 세트가 U+2586을 나타낼 수 없는 경우 결과는 "\u2586" 문자열이 됩니다(zsh는 "범위에 없는 문자" 오류와 함께 실패합니다).

이렇게 하면 대부분의 경우 원하는 동작이 생성됩니다. 가능하면 "▆"가 표시됩니다. 만약 너라면진짜문자의 UTF-8 표현을 출력하려면 모든 경우에 로케일을 재정의하여 이를 강제할 수 있습니다.예를 들어

LC_ALL= LC_CTYPE=en_US.UTF-8 printf '%s%b%s\n' "$(tput setaf 118)" "\u2586" "$(tput sgr0)"

(바라보다LANG=C와 LC_ALL=C의 차이점은 무엇입니까?위에서 사용된 변수 설정에 대한 참고 사항입니다. )

답변2

\uxxxx및에 대한 지원은 2000년에 독립 실행형 유틸리티의 GNU 구현 \UXXXXXXXX에 처음 추가되었지만 다른 이스케이프 시퀀스와 마찬가지로 형식 인수나 지정자의 인수에서만 인식됩니다. 문자열을 그대로 표시하는 데 사용되지 않습니다 .printf%b%s

printf나중에 2003년에 내장 기능 ( / 및 There zsh에도 해당 ), 2004년에 ksh93, 2010년에 bash(4.2) 에 추가되었으며 그 이후로 아마도 몇 가지 내장 기능이 더 추가되었을 것입니다.echoprint$'...'

그러나 이것은 표준이 아닙니다. 계획이 있다POSIX는 $'...'ksh93의 인용 형식을 지정합니다.\u/ 시퀀스를 허용 \U하지만 현재 문제 중 하나는 이러한 따옴표를 사용하는 명령을 구문 분석 및/또는 실행할 때 현재 로캘의 문자 집합이 UTF-8이 아닌 경우 확장을 처리하는 방법입니다.

그럼에도 불구하고 스크립트가 UTF-8 문자 세트를 사용하는 로케일에서 시작되고 그 이후 )LC_CTYPE변수로LC_ALLLANG$'\uxxxx'

$'\UXXXXXXXX'코드 포인트가 0xFFFF보다 높은 문자 에 사용됩니다 . 일부 쉘에는 4자리 숫자 \u와 8자리 숫자가 모두 필요합니다 \U. 따라서 이식성을 극대화하려면 또는 를 사용하세요 $'St\u00E9phane'. 필요한 모든 쉘에서는 16진수이므로 16진수로 처리됩니다. 지원되는 셸의 경우 또는를 사용하고 따옴표 연산자를 혼합하여 일치시킬 수도 있습니다.$'St\U000000E9phane'StéphaneSt\u00E9fanStéfan$'St\ue9fanSt \U0E9F anef$'\ue9'$'St\ue9'$'fan'St$'\ue9'fan

printf그런 다음 이러한 확장을 모든 명령 이나 다른 명령 에 전달할 수 있습니다 .

특별한 경우에는 zshprint내장 기능을 사용할 수 있습니다.

print -P '%F{118}\u2586%f'

-P명령을 실행하지 않고도 프롬프트 확장이 전경색을 설정할 수 있게 해줍니다 tput. 또는:

print -rP '%F{118}'$'\u2586''%f'

여기서 이스케이프 시퀀스를 비활성화하고 따옴표를 사용하여 -r문자 그대로 U+2586 문자를 전달합니다 .print$'...'

또는:

arbitrary_text=$'\u2586'' arbitrary text with \backslash and % characters'
print -r -- ${(%):-%F{118}}$arbitrary_text${(%):-%f}

확장은 수행되지 않지만 인수 확장 플래그 print에 의해 색상 이스케이프 시퀀스가 ​​생성되고 %U+2586이 변수에 그대로 저장됩니다. 인쇄-r

관련 정보