일부 유니 코드 문자가 터미널에 인쇄되지 않는 이유는 무엇입니까? 사용하고 있습니다. 카드 한 벌의 유니

Adobe Source Code Pro 글꼴을 사용하여 간단한 터미널로 Arch Linux를 실행하고 있습니다. 내 로케일이로 설정되었습니다 LANG=en_US.UTF-8.

카드 놀이를 나타내는 유니 코드 문자를 터미널에 인쇄하고 싶습니다. 참조 용으로 Wikipedia를 사용하고 있습니다.

카드 한 벌의 유니 코드 문자가 제대로 작동합니다. 예를 들어, 발행

$ printf "\u2660"

화면에 검은 마음을 인쇄합니다.

그러나 특정 카드 놀이에 문제가 있습니다. 발행

$ printf "\u1F0A1"

Ἂ1스페이드 에이스 대신 기호 를 인쇄합니다 . 무슨 일이야?

이 문제는 여러 터미널 (urxvt, xterm, termite)과 내가 시도한 모든 글꼴 (DejaVu, Inconsolata)에 걸쳐 지속됩니다.



답변

help printfprintf(1)해석 된 이스케이프 시퀀스는 지연되고 GNU printf 문서 는 다음 과 같이 말합니다.

printf해석 ISO C (99)에 도입 된 두 문자 구문을 :
\u16 진수 4 개 디지트로 지정된 16 비트 유니 코드 (ISO / IEC 10646) 문자에 대한 HHHH\U여덟 진수 자리로 지정된 32 비트 유니 코드 문자를위한 HHHHHHHH . 로케일 printf에 따라 유니 코드 문자를 출력합니다 LC_CTYPE. U + 0024 ($), U + 0040 (@) 및 U + 0060 (`)을 제외하고 U + 0000… U + 009F, U + D800… U + DFFF 범위의 유니 코드 문자는이 구문으로 지정할 수 없습니다. .

비슷한 뭔가가에 대한 배쉬 설명서에 지정된 ANSI C는 인용echo:

\uHHHH
값이 16 진수 값 HHHH (1-4 자리 16 진수) 인 유니 코드 (ISO / IEC 10646) 문자

\UHHHHHHHH
값이 16 진수 값 HHHHHHHH ( 1-8 자리 16 진수) 인 유니 코드 (ISO / IEC 10646) 문자

한마디로 : \u5 자리 16 진수가 아닙니다. 그것은 \U:

# printf "\u2660 \u1F0A1 \U1F0A1\n"
 1 ?

답변

Muru의 답변은 완전히 정확하지만 한 가지 요점을 명확히하기 위해 :

인쇄 할 때 \u1F0A116 비트 유니 코드 이스케이프로 해석되고 \u1F0A그 뒤에 리터럴 문자 가 해석됩니다 1( \u따라서 다음 문자를 사용 하므로 더 이상은 안됩니다). 그런 다음 U + 1F0A 는 몇 분음 부호가있는 그리스 알파 ( Psili 및 Varia가 포함 된 그리스 대문자 알파 )를 제공합니다.

유니 코드 이스케이프에서 16 비트 이상을 원하면 \U8 자의 16 진수가 필요한을 사용해야 \U0001F0A1합니다. 재생 카드를 제공합니다.