UTF-8“가변 너비 인코딩”은 어떻게 작동합니까?


110

유니 코드 표준에는 모두 저장하는 데 4 바이트가 필요한 충분한 코드 포인트가 있습니다. 이것이 UTF-32 인코딩이하는 일입니다. 그러나 UTF-8 인코딩은 "가변 너비 인코딩"이라는 것을 사용하여이를 훨씬 더 작은 공간으로 압축합니다.

실제로 US-ASCII의 처음 127 개 문자를 실제 ASCII와 똑같이 보이는 단 1 바이트로 표현할 수 있으므로 아무 작업도하지 않고도 많은 ASCII 텍스트를 UTF-8 인 것처럼 해석 할 수 있습니다. 깔끔한 트릭. 그래서 어떻게 작동합니까?

나는 그것을 이해하기 위해 약간의 독서를했고 다른 누군가의 시간을 절약 할 수있을 것이라고 생각했기 때문에 여기에서 내 자신의 질문을 묻고 대답 할 것입니다. 게다가 내가 틀렸다면 누군가 나를 고칠 수도 있습니다.


8
스트레이트 유니 코드는 모든 코드 포인트를 인코딩하는 데 32 비트가 필요 하지 않습니다 . 그들은 한때 가능한 많은 코드 포인트에 대해 주장했지만 UTF-8이 출시 된 후 의도적으로 21 비트로 제한하여 UTF-8이 문자 당 4 바이트를 초과하지 않도록했습니다. 유니 코드는 현재 가능한 모든 코드 포인트를 보유하는 데 17 비트 만 필요합니다. 이 제한이 없으면 UTF-8은 문자 당 6 바이트로 늘어날 수 있습니다.
Warren Young

@Warren : 대부분 정확하지만 유니 코드는 21 비트 코드입니다 (U + 0000 ~ U + 10FFFF).
Jonathan Leffler

2
@Warren : 4 바이트 제한 UTF-8은 U + 1FFFFF까지 지원할 수 있습니다. U + 10FFFF에 대한 제한은 UTF-16을 위해 만들어졌습니다.
dan04

@ dan04 UTF-16에 의해 U + 10FFFF로 제한되는 방법에 대한 쉬운 설명이 있습니까? 이것에 대해 더 많이 알면 좋을 것입니다.
A-letubby

@ A-letubby : UTF-16 "대리"코드가 할당되어 1024 개의 리드 대리와 1024 개의 트레일 대리 (쌍으로 만 사용할 수 있음)가 있으므로 2 ^ 20 (약 백만 개)의 추가 문자를 만들 수 있습니다. BMP를 넘어서 사용할 수 있습니다. BMP에서 사용 가능한 2 ^ 16 문자에 추가되어 0x110000 문자를 사용할 수 있습니다.
dan04

답변:


129

각 바이트는 단일 바이트 코드 포인트인지, 멀티 바이트 코드 포인트인지, 멀티 바이트 코드 포인트의 연속인지를 알려주는 몇 개의 비트로 시작합니다. 이렇게 :

0xxx xxxx    A single-byte US-ASCII code (from the first 127 characters)

다중 바이트 코드 포인트는 각각 본질적으로 "내가 무엇인지 파악하려면 다음 바이트 (또는 2, 3)도 읽어야합니다"라고 말하는 몇 개의 비트로 시작합니다. 그들은:

110x xxxx    One more byte follows
1110 xxxx    Two more bytes follow
1111 0xxx    Three more bytes follow

마지막으로 시작 코드를 따르는 바이트는 모두 다음과 같습니다.

10xx xxxx    A continuation of one of the multi-byte characters

처음 몇 비트에서 어떤 종류의 바이트를보고 있는지 알 수 있으므로 어딘가에서 엉망이 되더라도 전체 시퀀스를 잃지 않습니다.


14
그 이상의 이야기가 있습니다. 인코딩은 문자에 대해 가능한 가장 짧은 인코딩이어야하므로 결과적으로 0xC0 및 0xC1 바이트는 UTF-8로 나타날 수 없습니다. 사실 0xF5..0xFF도 마찬가지입니다. unicode.org/faq/utf_bom.html 또는 unicode.org/versions/Unicode5.2.0/ch03.pdf
Jonathan Leffler

2
왜 한 문자 만 사용하면 안되나요 next char is continuation? 3 바이트 문자가 있으면 다음과 같을 것입니다. 1xxxxxxx 1xxxxxxx 0xxxxxxx따라서 공간이 더 적게 낭비됩니다.

9
@Soaku는 UTF-8을 소위 "자체 동기화"코드로 만듭니다. 이는 오류로 인해 시퀀스의 일부가 누락 된 경우이를 감지하고 왜곡 된 항목을 폐기 할 수 있음을 의미합니다. 10xx로 시작하는 바이트를 읽고 선행 "시작"바이트가없는 경우 의미가 없으므로 삭제할 수 있습니다. 설명한 것과 같은 시스템이 있고 첫 번째 바이트 중 하나가 손실되면 어떤 종류의 오류도 표시하지 않고 다른 유효한 문자로 끝날 수 있습니다. 또한 다음 유효한 문자를 쉽게 찾을 수있을뿐만 아니라 누락 된 "연속"바이트를 수정할 수 있습니다.
htmlcoderexe dec. 05 '172017-12-05

9

RFC3629-ISO 10646의 변환 형식 인 UTF-8 이 여기에서 최종 권한이며 모든 설명이 있습니다.

요컨대, 단일 문자를 나타내는 UTF-8로 인코딩 된 1-4 바이트 시퀀스의 각 바이트에있는 여러 비트를 사용하여 후행 바이트인지 선행 바이트인지, 그렇다면 뒤에 오는 바이트 수를 나타냅니다. 나머지 비트에는 페이로드가 포함됩니다.


1
Ummmm, 어리석은 날, 유니 코드 표준이 UTF-8의 최종 권한이라고 생각했습니다
John Machin

6
유니 코드 표준은 유니 코드 자체를 정의합니다. 다양한 목적 (예 : 저장 및 전송)을 위해 유니 코드 텍스트를 인코딩하는 데 사용할 수있는 현재와 미래의 다양한 방법을 정의하지 않습니다. UTF-8은 이러한 방법 중 하나이며 위의 참조는이를 정의하는 문서에 대한 것입니다.
azheglov

1
RFC3629, 페이지 3, 섹션 3. "UTF-8은 유니 코드 표준에 의해 정의 됨"이라고 말합니다.
존 머신

unicode.org의 링크를 쫓는 것은 유니 코드 표준의 섹션 3.9 와 구체적으로 정의 D92 (또한 접선 적으로 D86)로 이동했습니다. 새 버전이 출시 될 때이 링크가 어느 정도 유용할지는 모르겠지만 섹션 및 정의 식별자를 버전간에 안정적으로 유지하기를 원할 것입니다.
tripleee

4

UTF-8은 8 비트 바이트를 사용하여 메모리에 유니 코드 코드 포인트 문자열 인 마법의 U + 숫자를 저장하는 또 다른 시스템입니다. UTF-8에서 0-127의 모든 코드 포인트는 단일 바이트에 저장됩니다. 128 이상의 코드 포인트 만 2, 3, 실제로 최대 6 바이트를 사용하여 저장됩니다.

절대 최소 에서 발췌 모든 소프트웨어 개발자는 절대적으로 유니 코드 및 문자 집합에 대해 반드시 알아야합니다 (변명 없음!)


그것은 좋은 기사이지만, Joel은 시퀀스의 최대 길이에 대해 잘못된 것 같습니다. Wikipedia 페이지에는 문자 당 1..4 바이트 만 표시됩니다.
긴장을 풀어

4
위에서 말했듯이 UTF-8이 처음 만들어 졌을 때 유니 코드는 코드 포인트에 대해 최대 32 비트를 요구합니다. 실제로 필요했기 때문이 아니라 32 비트가 편리한 값이고 이미 16 비트 문자의 이전 제한. UTF-8이 인기를 얻은 후, 그들은 최대 코드 포인트 수를 2 ^ 21로 영원히 제한하기로 결정했습니다. 이는 UTF-8 체계의 4 바이트로 인코딩 할 수있는 가장 큰 값입니다. 유니 코드에는 여전히 2 ^ 17 개 미만의 문자가 있으므로이 새로운 체계를 사용하면 유니 코드의 문자 수를 4 배 이상 늘릴 수 있습니다.
Warren Young

좋아하지만 OP가 요청한 설명은 아닙니다.
Nishant 2014 년

2
이것은 질문에 대한 답이 아닙니다.
Koray Tugay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.