Programing

UTF-8로 인코딩 할 수있는 문자는 몇 개입니까?

crosscheck 2020. 10. 9. 08:51
반응형

UTF-8로 인코딩 할 수있는 문자는 몇 개입니까?


UTF-8이 8 비트이면 최대 256 개의 문자 만있을 수 있다는 의미가 아닙니까?

처음 128 개의 코드 포인트는 ASCII에서와 동일합니다. 그러나 UTF-8은 최대 백만 개의 문자를 지원할 수 있다고 말합니다.

어떻게 작동합니까?


UTF-8은 항상 1 바이트를 사용하지 않으며 1-4 바이트입니다.

처음 128 자 (US-ASCII)에는 1 바이트가 필요합니다.

다음 1,920 개의 문자를 인코딩하려면 2 바이트가 필요합니다. 여기에는 거의 모든 라틴 알파벳의 나머지 부분과 그리스어, 키릴 문자, 콥트어, 아르메니아어, 히브리어, 아랍어, 시리아 어 및 타나 어 알파벳과 분음 부호 결합이 포함됩니다.

대부분의 중국어, 일본어 및 한국어 [CJK] 문자를 포함하여 거의 모든 공통 문자 [12]를 포함하는 나머지 기본 다국어 평면의 문자에는 3 바이트가 필요합니다.

덜 일반적인 CJK 문자, 다양한 역사적 스크립트, 수학 기호 및 이모티콘 (그림 기호)을 포함하는 유니 코드의 다른 평면에있는 문자에는 4 바이트가 필요합니다.

출처 : Wikipedia


UTF-8은 문자 당 1-4 바이트를 사용합니다. ASCII 문자의 경우 1 바이트 (처음 128 개의 유니 코드 값은 ascii와 동일) 하지만 7 비트 만 필요합니다. 가장 높은 ( "부호") 비트가 설정되면 멀티 바이트 시퀀스의 시작을 나타냅니다. 연속적인 상위 비트 세트의 수는 바이트 수를 나타내고 그 다음에는 0을 나타내며 나머지 비트가 값에 기여합니다. 다른 바이트의 경우 가장 높은 두 비트는 1과 0이고 나머지 6 비트는 값입니다.

따라서 4 바이트 시퀀스는 11110 ... (및 ... = 값에 대해 3 비트)으로 시작하고 값에 대해 각각 6 비트가있는 3 바이트로 21 비트 값을 생성합니다. 2 ^ 21은 유니 코드 문자 수를 초과하므로 모든 유니 코드를 UTF8로 표현할 수 있습니다.


이 표 에 따르면 * UTF-8 은 다음을 지원 해야 합니다.

2 31 = 2,147,483,648 자

그러나, RFC 3629는 그래서 지금 우리가하고, 가능한 값을 제한 4 바이트에 덮인 우리를 준다,

2 21 = 2,097,152 자

이러한 문자의 좋은 덩어리는 사용자 정의 사용을 위해 "예약"되어 있으며 실제로 아이콘 글꼴에 매우 편리합니다.

* 사용 된 Wikipedia는 6 바이트의 테이블을 보여줍니다. 이후 기사를 업데이트했습니다.

2017-07-11 : 여러 바이트로 인코딩 된 동일한 코드 포인트를 이중 계산하도록 수정 됨


유니 코드 대 UTF-8

유니 코드는 코드 포인트를 문자로 해석합니다. UTF-8은 유니 코드를위한 저장 메커니즘입니다. 유니 코드에는 사양이 있습니다. UTF-8에는 사양이 있습니다. 둘 다 다른 한계가 있습니다. UTF-8은 상향 바인딩이 다릅니다.

유니 코드

유니 코드는 "평면" 으로 지정됩니다 . 각 비행기에는 2 개의 16 개의 코드 포인트가 있습니다. 유니 코드에는 17 개의 평면이 있습니다. 17 * 2^16코드 포인트. 번째 평면 인 평면 0 또는 BMP 는 운반하는 무게가 특별합니다.

모든 뉘앙스를 설명하기보다는 위의 기사를 비행기에 대해 인용하겠습니다.

17 개의 평면은 1,114,112 개의 코드 포인트를 수용 할 수 있습니다. 이 중 2,048 개는 대리자이고 66 개는 비 문자이며 137,468 개는 개인용으로 예약되어 있으며 974,530 개는 공개 할당 용으로 남겨집니다.

UTF-8

이제 위에 링크 된 기사로 돌아가 보겠습니다.

UTF-8에서 사용하는 인코딩 체계는 2 31 개의 코드 포인트 (32,768 개의 플레인) 라는 훨씬 더 큰 제한으로 설계되었으며 4 바이트로 제한 되더라도 2 개의 21 개의 코드 포인트 (32 개의 플레인)를 인코딩 할 수 있습니다 . [3] 유니 코드는 코드 포인트를 UTF-16으로 인코딩 할 수있는 17 개의 평면으로 제한하므로 0x10FFFF 이상의 코드 포인트는 UTF-8 및 UTF-32에서 유효하지 않습니다.

따라서 유효한 유니 코드가 아닌 것을 UTF-8에 넣을 수 있음을 알 수 있습니다. 왜? UTF-8은 유니 코드가 지원하지 않는 코드 포인트를 수용하기 때문입니다.

UTF-8은 4 바이트 제한이 있어도 2 21 코드 포인트를 지원합니다.17 * 2^16


2,164,864 개의 "문자"는 잠재적으로 UTF-8로 코딩 될 수 있습니다.

이 숫자는 2 ^ 7 + 2 ^ 11 + 2 ^ 16 + 2 ^ 21이며 인코딩이 작동하는 방식에서 비롯됩니다.

  • 1 바이트 문자는 인코딩을위한 7 비트 0xxxxxxx(0x00-0x7F)

  • 2 바이트 문자는 인코딩을위한 11 비트 110xxxxx 10xxxxxx(첫 번째 바이트의 경우 0xC0-0xDF, 두 번째 바이트의 경우 0x80-0xBF)

  • 3 바이트 문자는 인코딩을위한 16 비트 1110xxxx 10xxxxxx 10xxxxxx(첫 번째 바이트의 경우 0xE0-0xEF, 연속 바이트의 경우 0x80-0xBF)입니다.

  • 4 바이트 문자는 인코딩을 위해 21 비트 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx를가집니다 (첫 번째 바이트는 0xF0-0xF7, 연속 바이트는 0x80-0xBF).

보시다시피 현재 유니 코드 (1,112,064 자)보다 훨씬 큽니다.


UTF-8은 문자 당 최소 8 비트 가변 길이 인코딩입니다 . 코드 포인트가 더 높은 문자는 최대 32 비트를 차지합니다.


Wikipedia의 인용문 : "UTF-8은 1-4 개의 8 비트 바이트 (유니 코드 표준에서"옥텟 "이라고 함)를 사용하여 유니 코드 문자 집합의 1,112,064 코드 포인트 각각을 인코딩합니다."

일부 링크 :


유니 코드 표준 및 관련 정보 (예 : FAQ 항목, UTF-8 UTF-16, UTF-32 및 BOM)를 확인하십시오 . 순조로운 항해는 아니지만 권위있는 정보이며 다른 곳에서 UTF-8에 대해 읽을 수있는 내용의 대부분은 의심 스럽습니다.

The “8” in “UTF-8” relates to the length of code units in bits. Code units are entities use to encode characters, not necessarily as a simple one-to-one mapping. UTF-8 uses a variable number of code units to encode a character.

The collection of characters that can be encoded in UTF-8 is exactly the same as for UTF-16 or UTF-32, namely all Unicode characters. They all encode the entire Unicode coding space, which even includes noncharacters and unassigned code points.


While I agree with mpen on the current maximum UTF-8 codes (2,164,864) (listed below, I couldn't comment on his), he is off by 2 levels if you remove the 2 major restrictions of UTF-8: only 4 bytes limit and codes 254 and 255 can not be used (he only removed the 4 byte limit).

Starting code 254 follows the basic arrangement of starting bits (multi-bit flag set to 1, a count of 6 1's, and terminal 0, no spare bits) giving you 6 additional bytes to work with (6 10xxxxxx groups, an additional 2^36 codes).

Starting code 255 doesn't exactly follow the basic setup, no terminal 0 but all bits are used, giving you 7 additional bytes (multi-bit flag set to 1, a count of 7 1's, and no terminal 0 because all bits are used; 7 10xxxxxx groups, an additional 2^42 codes).

Adding these in gives a final maximum presentable character set of 4,468,982,745,216. This is more than all characters in current use, old or dead languages, and any believed lost languages. Angelic or Celestial script anyone?

Also there are single byte codes that are overlooked/ignored in the UTF-8 standard in addition to 254 and 255: 128-191, and a few others. Some are used locally by the keyboard, example code 128 is usually a deleting backspace. The other starting codes (and associated ranges) are invalid for one or more reasons (https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences).


Unicode is firmly married to UTF-8. Unicode specifically supports 2^21 code points (2,097,152 characters) which is exactly the same number of code points supported by UTF-8. Both systems reserve the same 'dead' space and restricted zones for code points etc. ...as of June 2018 the most recent version, Unicode 11.0, contains a repertoire of 137,439 characters

From the unicode standard. Unicode FAQ

The Unicode Standard encodes characters in the range U+0000..U+10FFFF, which amounts to a 21-bit code space.

From the UTF-8 Wikipedia page. UTF-8 Description

Since the restriction of the Unicode code-space to 21-bit values in 2003, UTF-8 is defined to encode code points in one to four bytes, ...

참고URL : https://stackoverflow.com/questions/10229156/how-many-characters-can-utf-8-encode

반응형