character-encoding 인코딩 - UTF-8과 ISO-8859-1의 차이점은 무엇입니까?




(7)

이 질문을 연구하는 이유는 관점에서, 어떤면에서 호환이 가능한지에 관한 것입니다. Latin1 charset (iso-8859)은 100 % 호환되어 utf8 데이터 스토어에 저장됩니다. 모든 ascii & extended-ascii 문자는 1 바이트로 저장됩니다.

다른 방법으로, utf8에서 Latin1 문자 세트로 가거나 작동하지 않을 수 있습니다. 2 바이트 문자 (확장 ASCII-255 이상의 문자)가있는 경우 Latin1 데이터 저장소에 저장하지 않습니다.

UTF-8ISO-8859-1 의 차이점은 무엇입니까?


UTF

UTF 는 최대 2 ^ 31 [약 20 억] 문자를 반복 할 수있는 Unicode 코드 코드 포인트를 나타낼 수있는 멀티 바이트 인코딩 체계 계열입니다. UTF-8 은 처음 2 ^ 25 [약 3200 만] 코드 포인트를 나타내는 1에서 4 바이트 사이의 유연한 인코딩 시스템입니다.

긴 이야기 : 코드 포인트 / 서수 표현이 127 이하인 모든 문자 (일명 7 비트 안전 ASCII)는 다른 대부분의 단일 바이트 인코딩과 동일한 1 바이트 시퀀스로 표시됩니다. 127보다 큰 코드 포인트를 가진 문자는 두 개 이상의 바이트 시퀀스로 표현되며 here 가장 잘 설명 된 인코딩이 here .

ISO-8859

ISO-8859ISO-8859 의 범위 내에서 표현할 수있는 알파벳을 나타 내기 위해 사용되는 1 바이트 인코딩 체계 계열입니다. 이러한 다양한 알파벳은 ISO-8859 - n 형식의 "부품"으로 정의되며, ISO-8859-1 즉 '라틴어 -1'일 가능성이 높습니다. UTF-8에서와 마찬가지로 7 비트 안전 ASCII는 사용되는 인코딩 패밀리와 상관없이 영향을받지 않습니다.

이 인코딩 스키마의 단점은 128 개 이상의 심볼로 구성된 언어를 수용 할 수 없거나 한 번에 둘 이상의 심볼 패밀리를 안전하게 표시 할 수 없다는 것입니다. 또한 ISO-8859 인코딩은 UTF의 등장으로 호의적이지 않습니다. 2004 년에 해체 된 ISO "실무 그룹 (Working Group)"은 부모 소위원회에 유지 보수를 맡겼습니다.


UTF-8은 모든 유니 코드 문자를 나타낼 수있는 멀티 바이트 인코딩입니다. ISO 8859-1은 첫 번째 256 유니 코드 문자를 나타낼 수있는 단일 바이트 인코딩입니다. 둘 다 ASCII를 정확히 같은 방식으로 인코딩합니다.


다른 관점에서, 유니 코드와 아스키 인코딩이 모두 0xc0 바이트를 가지고 있기 때문에 읽지 못하는 파일은 iso-8859-1에 의해 올바르게 읽혀지는 것 같습니다. 단점은 물론 파일에 유니 코드 문자가 없어야한다는 것입니다.


Wikipedia는 UTF-8Latin-1 (ISO-8859-1)을 합리적으로 설명합니다. 이전은 가변 길이 인코딩이며, 후자의 단일 바이트 고정 길이 인코딩입니다. Latin-1은 유니 코드 문자 세트의 처음 256 코드 포인트 만 인코딩하지만 UTF-8은 모든 코드 포인트를 인코딩하는 데 사용할 수 있습니다. 물리적 인 인코딩 레벨에서는 코드 포인트 0-127만이 동일하게 인코딩됩니다. 코드 포인트 128-255는 UTF-8과 2 바이트 시퀀스가 ​​됨으로써 다르지만 라틴 -1이있는 단일 바이트입니다.


  • ASCII : 7 비트. 128 코드 포인트.

  • ISO-8859-1 : 8 비트. 256 코드 포인트.

  • UTF-8 : 8-32 비트 (1-4 바이트) 1,112,064 코드 포인트.

ISO-8859-1 및 UTF-8은 모두 ASCII와 역 호환되지만 UTF-8은 ISO-8859-1과 역 호환되지 않습니다.

#!/usr/bin/env python3

c = chr(0xa9)
print(c)
print(c.encode('utf-8'))
print(c.encode('iso-8859-1'))

산출:

©
b'\xc2\xa9'
b'\xa9'

MySQL 서버가 클라이언트가 아닌 PHP (character set)를 클라이언트로 결정하기를 원한다면 (필자의 의견으로는, 필자의 의견으로는 선호), [mysqld] 아래의 my.cnf skip-character-set-client-handshake 를 추가하고 mysql 재시작하십시오.

이것은 UTF8 이외의 것을 사용하는 경우 문제를 일으킬 수 있습니다.





utf-8 character-encoding iso-8859-1