동일한 파일에서 ASCII와 UTF-8 문자를 구별합니다.

동일한 파일에서 ASCII와 UTF-8 문자를 구별합니다.

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 è문자, 즉 c3a82바이트로 표시됩니다. 각 문자를 나타내는 데 사용되는 바이트 수가 일정하지 않은 경우 파일 내용을 올바르게 해석하는 방법은 무엇입니까?

내 추측: 아마도 파서가 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에서 동일한 인코딩을 갖는다는 것을 의미합니다.0x000x7f

따라서 실제로 ASCII와 UTF-8을 구별하는 것은 불가능합니다. 왜냐하면 UTF-8 파일에서는 ASCII가UTF-8. file파일의 처음 96KiB를 보고 그것이 무엇인지 확인하십시오. 여러 UTF-8 코드 시퀀스가 ​​표시되므로 파일이 ASCII의 엄격한 상위 집합이기 때문에 파일이 UTF-8이라고 결정합니다.

관련 정보