설명과 함께 유니 코드로 가능한 모든 유효한 조합의 개수를 요청하고 있습니다. 나는 문자가 1,2,3 또는 4 바이트로 인코딩 될 수 있다는 것을 알고 있습니다. 또한 해당 문자의 시작 바이트가 얼마나 오래되어야하는지 지워도 연속 바이트에 제한이있는 이유를 이해하지 못합니다.
설명과 함께 유니 코드로 가능한 모든 유효한 조합의 개수를 요청하고 있습니다. 나는 문자가 1,2,3 또는 4 바이트로 인코딩 될 수 있다는 것을 알고 있습니다. 또한 해당 문자의 시작 바이트가 얼마나 오래되어야하는지 지워도 연속 바이트에 제한이있는 이유를 이해하지 못합니다.
답변:
설명과 함께 유니 코드로 가능한 모든 유효한 조합의 개수를 요청하고 있습니다.
1,111,998 : 평면 17 개 × 평면 당 65,536 자-대리 2048 개-비 문자 66 개
UTF-8 및 UTF-32는 이론적으로 17 개 이상의 플레인을 인코딩 할 수 있지만 범위는 UTF-16 인코딩 의 제한 에 따라 제한 됩니다.
실제로 137,929 개의 코드 포인트가 유니 코드 12.1로 할당됩니다 .
또한 해당 문자의 시작 바이트가 얼마나 오래되어야하는지 지워도 연속 바이트에 제한이있는 이유를 이해하지 못합니다.
UTF-8에서이 제한의 목적은 인코딩이 자체 동기화되도록하는 것 입니다.
반례로 중국 GB 18030 인코딩을 고려하십시오 . 여기서 문자 ß
는 81 30 89 38
숫자 0
및 의 인코딩을 포함하는 바이트 시퀀스로 표시됩니다 8
. 따라서이 인코딩 특정 특성을 위해 설계되지 않은 문자열 검색 기능이있는 경우 숫자 8
를 검색 하면 문자 내에서 잘못된 긍정이 발견됩니다 ß
.
UTF-8에서는 리드 바이트와 트레일 바이트 사이의 비 중첩이 더 짧은 문자의 인코딩이 더 긴 문자의 인코딩 내에서 발생하지 않도록 보장하기 때문에 발생할 수 없습니다.
유니 코드는 각각 65,536 개의 문자 (또는 '코드 포인트')의 17 개 플레인을 허용합니다 . 이것은 총 1,114,112 개의 가능한 문자를 제공합니다. 현재이 공간의 약 10 % 만 할당되었습니다.
이러한 코드 포인트가 인코딩되는 방법에 대한 정확한 세부 사항은 인코딩에 따라 다르지만 귀하의 질문은 UTF-8을 생각하는 것처럼 들립니다. 연속 바이트에 대한 제한 이유는 아마도 다음 문자의 시작을 쉽게 찾을 수 있기 때문입니다 (연속 문자는 항상 10xxxxxx 형식이지만 시작 바이트는이 형식이 될 수 없습니다).
유니 코드는 1,114,112 코드 포인트를 지원합니다. 1,112,064 스칼라 값을 제공하는 2048 개의 서로 게이트 코드 포인트가 있습니다. 이 중 66 개의 비 문자가있어 1,111,998 개의 인코딩 된 문자가 가능합니다 (계산 오류가없는 경우).
은유 적으로 정확한 답을 제공하려면 all of them
.
UTF-8 인코딩의 연속 바이트는 "라인 노이즈"에 직면하여 인코딩 된 옥텟 스트림의 재 동기화를 허용합니다. 인코더는 다음 바이트가 새 문자 포인트의 시작임을 알기 위해 0x80과 0xBF 사이의 값이없는 바이트를 앞으로 스캔하기 만하면됩니다.
이론적으로 오늘날 사용되는 인코딩은 유니 코드 문자 번호가 최대 31 비트 길이 인 문자의 표현을 허용합니다. 실제로이 인코딩은 실제로 Twitter와 같은 서비스에서 구현되며 최대 길이의 트윗은 최대 4,340 비트의 데이터를 인코딩 할 수 있습니다. (140 자 [유효 및 유효하지 않음], 각각 31 비트 곱하기)
perl -le 'print ord "\x{1FFF_FFFF_FFFF}"'
64 비트 컴퓨터에서는 35184372088831을 인쇄하지만 32 비트 컴퓨터에서는 정수 오버플로를 제공합니다. perl 프로그램 내에서 이와 같은 더 큰 문자를 사용할 수 있지만 utf8로 인쇄하려고하면 비활성화하지 않는 한 필수 경고가 표시됩니다 perl -le 'print "\x{1FFF_FFFF}"' Code point 0x1FFFFFFF is not Unicode, may not be portable at -e line 1. ######
.. "loose utf8"과 "strict UTF-8"사이에는 차이가 있습니다. 전자는 제한되지 않습니다.
len(chr(0x10000))
2 (코드 단위)를 제공하여 라고 말할 수 있습니다 . OS X의 커널은 올바른 UTF-8을 사용하지만 높은 수준의 API (Cocoa 등)는 UTF-16을 사용합니다.
[𝒜-𝒵]
UTF-16을 허물로 노출하는 이유를 알 수 있습니다. 프로그래머가 논리 문자 대신 인코딩 형식으로 생각하게 만드는 것은 실수입니다.
유니 코드의 16 진수 110000은 1114112입니다.
Wikipedia 에 따르면 유니 코드 12.1 (2019 년 5 월 출시)에는 137,994 개의 고유 문자가 포함되어 있습니다.