2017-03-27 7 views
0

저는 현재 도서 신속 프로그래밍 언어 3.1을 사용하여 신속하게 학습하고 있습니다.신속하게, utf16 서로 게이트 쌍이 비트로 표현되는 방법

이 책에서는 swift의 StringCharacter 유형이 완전히 유니 코드 호환이며 각 문자는 21 비트 유니 코드 스칼라 값으로 표시됩니다. 각 문자는 utf8, 16, 32를 통해 볼 수 있습니다.

바이트 및 비트 수준에서 utf8 및 utf32가 어떻게 작동하는지 이해하지만 utf16이 비트 수준에서 어떻게 작동하는지 이해하는 데 문제가 있습니다.

코드 포인트가 16 비트에 맞을 수있는 문자의 경우 utf16은 문자를 16 비트 숫자로 나타 내기 만합니다. 그러나 16 비트 이상을 필요로하는 문자의 경우 두 개의 16 비트 블록이 사용됩니다 (서로 게이트라고 함).

그러나 두 개의 16 비트 블록이 비트 수준으로 어떻게 표시됩니까?

답변

1

"Unicode Scalar Value"

높은 대리 낮은 대리 코드 포인트를 제외한 모든 유니 코드 코드 포인트입니다. 즉, 정수 0 ~ D7FF의 범위는 과 E000 ~ 10FFFF 을 포함합니다.

D91를 UTF-16 인코딩 형식

다음 Unicode Standard에 기재된

모든 유니 스칼라 값

는 하나 또는 두 개의 UTF-16 코드 단위의 시퀀스로서 표현 될 수있다

U + 0000..U + D7FF 및 U + E000..U + FFFF 범위의 각 유니 코드 스칼라 값을 유니 코드와 동일한 숫자 값을 가진 단일 부호없는 16 비트 코드 단위로 할당하는 유니 코드 인코딩 양식 스카 표 3-5에 따라 U + 10000..U + 10FFFF 범위의 각 유니 코드 스칼라 값을 서로 게이트 쌍에 할당합니다.

 
Table 3-5. UTF-16 Bit Distribution 

Scalar Value    UTF-16 
xxxxxxxxxxxxxxxx   xxxxxxxxxxxxxxxx 
000uuuuuxxxxxxxxxxxxxxxx 110110wwwwxxxxxx 110111xxxxxxxxxx 

Note: wwww = uuuuu - 1 

은 "보조 비행기"20 비트는 그들 모두 을 인코딩하기에 충분하다는 것을 의미한다 (U + 10000..U + 10FFFF) 2 개 20 유니 스칼라 값이있다 서로 게이트 쌍. 기술적으로 이것은 0x010000을 10 비트의 두 블록으로 분할하기 전에 값에서 뺀 값입니다.

1

utf16 범위 D800 ... DFFF는 예약되어 있습니다. 그 이하의 값은 단순한 16 비트 코드 포인트입니다. 값 D800..DBFF, D800을 뺀 값은 FFFC를 초과하는 20 비트 코드의 상위 10 비트입니다. 다음 2 바이트는 하위 10 비트를 포함합니다. 물론 endianness가 그림에 포함되어 utf8을 사용할 수 있기를 바랍니다. 한숨.

+0

도움이되는 의견에 감사드립니다. 그래서 utf16 문자가 가질 수있는 최대 비트 수는 20 비트라고 추측하고 있습니까? 첫 번째 16 비트 블록에서 10 비트 및 두 번째 16 비트 블록에서 10 비트? 하지만 유니 코드 스칼라 값은 21 비트로 표시됩니다. 그렇다면 유니 코드 스칼라 값 (21 비트)으로 표현할 수있는 것을 utf16 (20 비트)로 표현할 수 없다는 뜻입니까? – Thor

+1

@TonyStark : https://en.wikipedia.org/wiki/UTF-16#U.2B10000_to_U를 참조하십시오.2B10FFFF : 코드 포인트에서 0x010000을 뺀다. 0x000000..0x0FFFFF .... –

+0

utf16이 20 비트 수로 표현되면 @MartinR, 유니 코드 스칼라 값 (코드 포인트 일 뿐이다)을 남겨둔다. 문자에 대한) 21 비트 숫자로 표현됩니다, 그것은 어떤 유니 코드 스칼라 값은 utf16로 표현할 수 없다는 뜻인가요? – Thor