Charmap 파일의 문자 범위를 해석하는 방법은 무엇입니까?

Charmap 파일의 문자 범위를 해석하는 방법은 무엇입니까?

Charmap 파일에는 /usr/share/i18n/charmaps/UTF-8.gz다음 줄이 있습니다.

<U3400>..<U343F> /xe3/x90/x80 <CJK Ideograph Extension A>

지도 페이지에는 charmap(5)범위를 의미한다고만 나와 있습니다. 그러다가 내가 찾았어사양, 그러나 문자 이름의 숫자는 16진수가 아닌 10진수여야 한다고 나와 있으며 매뉴얼 페이지처럼 점 2개가 아닌 점 3개를 사용합니다. 그렇다면 Charmap 파일의 문자 범위를 어떻게 해석해야 합니까? 특히 내가 다음과 같은 것을 본다면

<U3400>..<U3430> /xe3/x90/x80 <CJK Ideograph Extension A>

그렇다면 범위는 10진수인가요, 16진수인가요?

답변1

glibc는 POSIX에서처럼 3자리 십진수 범위와 2자리 16진수 범위를 허용합니다. 이는 어디에도 문서화되어 있지 않은 것 같지만 소스 코드에서 볼 수 있습니다. 이것은아니요이식 가능한 동작이 정의되어 있지만 glibc 및 기타 가능한 확장을 사용할 수 있습니다. 자신의 파일을 작성하는 경우 10진수를 사용하십시오.


이것이 glibc의 실제 동작인지 확인해 보겠습니다.

범위를 다룰 때 glibc는 다음을 사용합니다.:

   if (decimal_ellipsis)
     while (isdigit (*cp) && cp >= from)
       --cp;
   else
     while (isxdigit (*cp) && cp >= from)
       {
         if (!isdigit (*cp) && !isupper (*cp))
           lr_error (lr, _("\
 hexadecimal range format should use only capital characters"));
         --cp;
       }

isxdigit16진수와 isdigit10진수의 유효성을 검사 합니다 . 나중에 동일한 방식으로 소비된 하위 문자열을 정수로 변환하고 예상한 대로 수행합니다.이전에는 구문 분석 중에 문제가 있는 줄임표 유형을 식별했습니다., 얻다어휘 분석기에서.

UTF-8 문자 맵 파일기계적으로 생성됩니다unicode.org 에서는 UnicodeData.txt두 포인트를 사용하여 64코드 포인트 범위를 만듭니다. 나는 이 편리한 자동 생성이 적어도 부분적으로 확장 기능보다 뒤떨어져 있다고 생각하지만 잘 모르겠습니다. 이전 버전의 glibc에서도 이를 생성했지만 다른 프로그램과 동일한 형식을 사용했습니다.

이번에도 이건 어디에도 문서화되어 있지 않은 것 같고, 사용하는 곳 옆에 자동으로 생성되기 때문에 바뀔 수도 있겠지만, 안정적일 거라고 생각합니다.


다음과 같은 것이 주어지면

<U3400>..<U3430> /xe3/x90/x80 <CJK Ideograph Extension A>

그렇다면 그것은16진수범위는 두 개의 점을 사용하기 때문입니다. 3개의 점이 있으면 POSIX 십진수 범위입니다.

이 확장자가 없는 다른 시스템을 사용하는 경우 이는 단지 구문 오류일 뿐입니다. 휴대용 문자 맵 파일은 소수 범위만 사용해야 합니다.

답변2

꺾쇠괄호( ) 안의 부분 <U3400>통합 컴퓨팅 시스템캐릭터 이름, 번호는16진수<ESC>, 링크된 사양의 기호 이름 과 해당 UCS를 비교할 때 볼 수 있듯이 .<U001B>

다음 부분은 인코딩입니다. 사양에서 볼 수 있듯이 3가지 형태가 있습니다.

\d123어디123는 십진수입니다.
\x123여기서123는 16진수이고,
\123여기서1238진수입니다.

따라서 <U3400>16진수 바이트 시퀀스로 표시되고 e3 90 80, <U3401>16진수 바이트 시퀀스로 표시됩니다 e3 90 81.

설명과 비교해보면UTF-8인코딩하면 일치하는 것을 볼 수 있습니다: 3바이트 시퀀스(비트)

11100011  10010000  10000000

와 결합하면

1110xxxx  10yyyyyy  10zzzzzz

인코딩된 숫자가 xxxx yyyy yyzz zzzz, 또는 0011 0100 0000 000, 또는 340016진수임을 알 수 있습니다.

관련 정보