UTF-8 은 유니 코드 코드 포인트를 가변 너비 형식으로 인코딩하여 유니 코드를 인식하지 못하는 코드를 쉽게 혼동하지 않는 비교적 간단한 방법입니다.
UTF-8 개요
- 1-0x7F 범위의 바이트는 일반적으로 유효합니다.
- 비트 패턴을
10XX XXXX
갖는 바이트는 연속 바이트로 간주되며 6 개의 최하위 비트는 코드 포인트의 일부를 인코딩하는 데 사용됩니다. 이들은 선행 바이트에 의해 예상되지 않는 한 나타나지 않아야합니다. - 패턴이
110X XXXX
있는 바이트는 이후에 하나의 연속 바이트를 예상합니다. - 패턴이
1110 XXXX
있는 바이트는 이후에 두 개의 연속 바이트를 예상합니다. - 패턴이
1111 0XXX
있는 바이트는 이후에 3 개의 연속 바이트를 예상합니다. - 다른 모든 바이트는 유효하지 않으며 UTF-8 스트림의 어느 곳에도 나타나서는 안됩니다. 이론적으로 5, 6 및 7 바이트 클러스터가 가능하지만이 문제의 목적으로 허용되지 않습니다.
긴 인코딩
UTF-8에서는 코드 포인트를 최소 바이트 수로 표시해야합니다. 더 적은 바이트로 표시 될 수있는 바이트 시퀀스는 유효하지 않습니다. 수정 된 UTF-8은 널 문자 (U + 0000)에 대해 여기에 하나의 예외를 추가하고 C0 80
(16 진 표현 으로 표시되어야 함 ) 대신 스트림의 어느 곳에 나 널 바이트가 나타나지 않도록합니다. (이것은 null로 끝나는 문자열과 호환됩니다)
도전
바이트 문자열이 제공 될 때 해당 문자열이 유효한 수정 UTF-8을 나타내는 지 판별하고 유효하면 거짓 값을, 그렇지 않으면 거짓 값을 리턴하는 프로그램을 작성해야합니다. 긴 인코딩 및 널 바이트 (이는 수정 UTF-8이므로)를 점검해야합니다. UTF-8 값을 디코딩 할 필요는 없습니다.
예
41 42 43 ==> yes (all bytes are in the 0-0x7F range)
00 01 02 ==> no (there is a null byte in the stream)
80 7F 41 ==> no (there is a continuation byte without a starter byte)
D9 84 10 ==> yes (the correct number of continuation bytes follow a starter byte)
F0 81 82 41 ==> no (there are not enough continuation bytes after F0)
EF 8A A7 91 ==> no (too many continuation bytes)
E1 E1 01 ==> no (starter byte where a continuation byte is expected)
E0 80 87 ==> no (overlong encoding)
41 C0 80 ==> yes (null byte encoded with the only legal overlong encoding)
F8 42 43 ==> no (invalid byte 'F8')
규칙
- 표준 규칙 및 허점이 적용됩니다
- 부호없는 바이트 범위 (0-255)의 모든 값을 읽을 수 있으면 입력 및 출력을 편리한 형식으로 지정할 수 있습니다.
- null로 끝나는 문자열 대신 배열이나 파일을 사용해야 할 수도 있습니다. 널 바이트를 읽을 수 있어야합니다.
- 최단 코드 승리!
- 내장을 사용하여 UTF-8을 디코딩한다고해서 여기에 주어진 요구 사항을 준수하는 것은 아닙니다. 이를 해결하고 특별한 경우를 작성해야 할 수도 있습니다.
편집 : UTF-8을 디코딩하는 내장을 사용하지 않는 것에 대한 보너스 추가
EDIT2 : Rust 답변 만 자격이 주어지고 보너스를 정의하기 때문에 보너스가 제거되었습니다.