[utf-8] 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 플레인) 의 훨씬 더 큰 제한으로 설계되었으며 2 21을 인코딩 할 수 있습니다. 4 바이트로 제한 되더라도 코드 포인트 (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 코드 포인트를 인코딩합니다.”

일부 링크 :