Ubuntu 18.04에서는 하나의 UTF-8 문자만 포함하는 더미 텍스트 파일을 만들었습니다 è
. 다른 문자는 모두 다음과 같습니다 ascii
.
$ cat dummytext
Hello
Helloè
결과는 다음과 같습니다 hexdump
.
$ hexdump -C dummyfile
00000000 48 65 6c 6c 6f 0a 48 65 6c 6c 6f c3 a8 0a |Hello.Hello...|
0000000e
파일은 다음과 같이 식별됩니다.
$ file dummyfile
dummyfile2: UTF-8 Unicode text
각 문자는 로 표시됩니다.하나의바이트,와는 별개로UTF-8 è
문자, 즉 c3a8
2바이트로 표시됩니다. 각 문자를 나타내는 데 사용되는 바이트 수가 일정하지 않은 경우 파일 내용을 올바르게 해석하는 방법은 무엇입니까?
내 추측: 아마도 파서가 ascii
마지막 문자보다 큰 16진수 값 7F
(예: 경우 c3
)을 발견하면 인쇄할 올바른 문자를 결정하기 위해 적어도 다른 바이트를 읽어야 합니까?
답변1
BSD 매뉴얼 섹션 5의 UTF8 페이지는 다음과 같습니다.
설명하다
UTF-8 인코딩은 UCS-4 문자를 각 문자에 대해 1에서 6 사이의 숫자를 사용하여 옥텟 시퀀스로 나타냅니다. 이는 ASCII와 역호환되므로 ASCII 문자 집합을 참조하세요
0x00
.0x7f
비ASCII 문자의 멀티바이트 인코딩은 상위 비트 세트가 있는 바이트로만 구성됩니다. 실제 인코딩은 아래 표에 나와 있습니다.
[0x00000000 - 0x0000007f] [00000000.0bbbbbbb] -> 0bbbbbbb [0x00000080 - 0x000007ff] [00000bbb.bbbbbbbb] -> 110bbbbb, 10bbbbbb [0x00000800 - 0x0000ffff] [bbbbbbbb.bbbbbbbb] -> 1110bbbb, 10bbbbbb, 10bbbbbb [0x00010000 - 0x001fffff] [00000000.000bbbbb.bbbbbbbb.bbbbbbbb] -> 11110bbb, 10bbbbbb, 10bbbbbb, 10bbbbbb [0x00200000 - 0x03ffffff] [000000bb.bbbbbbbb.bbbbbbbb.bbbbbbbb] -> 111110bb, 10bbbbbb, 10bbbbbb, 10bbbbbb, 10bbbbbb [0x04000000 - 0x7fffffff] [0bbbbbbb.bbbbbbbb.bbbbbbbb.bbbbbbbb] -> 1111110b, 10bbbbbb, 10bbbbbb, 10bbbbbb, 10bbbbbb, 10bbbbbb
값에 대한 표현이 여러 개 있는 경우(예:
0x00
;0xC0 0x80
;0xE0 0x80 0x80
) 항상 가장 짧은 표현이 사용됩니다. 더 긴 문자는 잠재적인 보안 위험을 초래하고 1:1 문자:옥텟 시퀀스 매핑을 손상시키므로 오류로 감지됩니다.
섹션 7의 UTF8에 대한 Linux 매뉴얼 페이지도 비슷하게 읽습니다.
설명하다
[... 어떤 경우에는 UTF-8이 UCS-2보다 낫습니다. 부분적으로는 대부분의 UNIX 도구에 ASCII 파일이 필요하고 상당한 수정 없이는 16비트 단어를 문자로 읽을 수 없기 때문입니다. [...]
유니코드 및 UCS의 UTF-8 인코딩은 이러한 문제를 겪지 않으며 UNIX 스타일 운영 체제에서 유니코드를 사용하는 일반적인 방법입니다.
특성
UTF-8 인코딩은 다음과 같은 뛰어난 특성을 가지고 있습니다.
- UCS 문자
0x00000000
( 기존 US-ASCII 문자)는 단순히 바이트 ( ASCII 호환성)0x0000007f
로 인코딩됩니다 . 이는 7비트 ASCII 문자만 포함하는 파일과 문자열이 ASCII 및 UTF-8에서 동일한 인코딩을 갖는다는 것을 의미합니다.0x00
0x7f
따라서 실제로 ASCII와 UTF-8을 구별하는 것은 불가능합니다. 왜냐하면 UTF-8 파일에서는 ASCII가예UTF-8. file
파일의 처음 96KiB를 보고 그것이 무엇인지 확인하십시오. 여러 UTF-8 코드 시퀀스가 표시되므로 파일이 ASCII의 엄격한 상위 집합이기 때문에 파일이 UTF-8이라고 결정합니다.