특정 유니코드 문자가 내 터미널에 인쇄되지 않는 이유는 무엇입니까?

특정 유니코드 문자가 내 터미널에 인쇄되지 않는 이유는 무엇입니까?

간단한 터미널을 통해 Arch Linux를 실행하기 위해 Adobe Source Code Pro 글꼴을 사용하고 있습니다. 내 로캘이 으로 올바르게 설정되어 있습니다 LANG=en_US.UTF-8.

카드 놀이를 나타내는 유니코드 문자를 내 터미널에 인쇄하고 싶습니다. 나는 그것을 사용하고 있다참고용 위키피디아.

카드 슈트의 유니코드 문자는 잘 작동합니다. 예를 들어, 문제

$ printf "\u2660"

화면에 검은색 하트를 인쇄합니다.

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

$ printf "\u1F0A1"

Ἂ1스페이드 에이스 대신 기호 인쇄

답변1

help printf해석된 이스케이프 시퀀스를 따르고 printf(1),GNU printf에 대한 문서설명하다:

printfISO C 99에 도입된 두 가지 문자 구문 설명: \u16비트 유니코드(ISO/IEC 10646) 문자의 경우 4자리 16진수로 지정됨헤헤, \U32비트 유니코드 문자의 경우 8자리 16진수로 지정됩니다.하하하하. 유니코드 문자는 로케일 설정 printf에 따라 출력됩니다. LC_CTYPE이 구문은 U+0024($), U+0040(@) 및 U+0060(`)을 제외하고 U+0000…U+009F, U+D800…U+DFFF 범위의 유니코드 문자를 지정할 수 없습니다.

Bash 매뉴얼은 비슷한 것을 지정합니다ANSI C 견적그리고echo:

\uHHHH
값이 16진수 값인 유니코드(ISO/IEC 10646) 문자하하하하(1~4개의 16진수)

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

즉, \u5자리 16진수에서는 작동하지 않습니다. 그것은 \U:

# printf "\u2660 \u1F0A1 \U1F0A1\n"
♠ Ἂ1 

답변2

Muru의 답변은 완전히 정확하지만 명확히 하기 위해 다음과 같이 설명합니다.

인쇄하면 \u1F0A116비트 유니코드 이스케이프 \u1F0A와 리터럴 문자로 해석됩니다 1( \u왜냐하면4개그 이상도 그 이하도 아닌 문자). U+1F0A는 여러 발음 구별 부호가 있는 그리스 문자 를 제공합니다(Psili 및 Varia가 포함된 그리스 대문자 Alpha, 정확히 말하면).

유니코드 이스케이프에서 16비트 이상을 원하면 Poker를 사용해야 합니다. 여기 \U에는 8자리 16진수 값이 필요합니다.\U0001F0A1

관련 정보