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


답변:


321

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


11
ASCII는 0에서 127까지만 확장됩니다. MSB는 항상 0입니다.
Hritik

3
127 이상의 코드 포인트가 정의되면 인코딩 시스템은 확장 ASCII 버전입니다.
Rohan Bhale

1
@RohanBhale 확장 ASCII 문구를 사용하지 마십시오. 혼란을 일으킬뿐입니다.
Mr Lister

그러나 확장 된 ASCII는 올바른 용어 일 수 있습니다. 여러 자료를 읽었습니다
Rohan Bhale

135

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


@mu 어쩌면 내 문장이 모호한 것일 수도 있지만 잘못된 것은 아닙니다. 인코딩 된 바이트 시퀀스가 ​​아니라 문자 세트가 인코딩되는 것입니다. 이는 ISO-8859-1이 유니 코드 문자 집합의 처음 256 개 코드 포인트를 인코딩하는 데 사용됨을 의미합니다.
StaxMan

당신의 설명은 저에게 효과적이며 "모호한"은 "잘못된"보다 더 나은 단어 선택이었습니다.
mu는

83

UTF

UTF 는 최대 2 ^ 31 [약 20 억] 문자를 나타낼 수있는 유니 코드 코드 포인트를 나타낼 수있는 멀티 바이트 인코딩 체계의 제품군입니다 . UTF-8 은 1 ~ 4 바이트를 사용하여 첫 2 ^ 21 [약 2 백만] 코드 포인트를 나타내는 유연한 인코딩 시스템입니다.

간단히 말해 : 7 비트 안전 ASCII라고하는 코드 포인트 / 소수점 표현이 127 미만인 문자는 대부분의 다른 1 바이트 인코딩과 동일한 1 바이트 시퀀스로 표시됩니다. 코드 포인트가 127 이상인 모든 문자는 2 바이트 이상의 시퀀스로 표시되며 여기에서 가장 잘 설명 된 인코딩이 있습니다 .

ISO-8859

ISO-8859 는 127에서 255 사이의 범위에서 표현 될 수있는 알파벳을 나타내는 데 사용되는 단일 바이트 인코딩 체계입니다. 이러한 다양한 알파벳은 가장 익숙한 ISO-8859- n 형식의 "부분"으로 정의됩니다. 이것은 아마도 ISO-8859-1 일명 '라틴 -1'일 것입니다. UTF-8과 마찬가지로 7 비트 안전 ASCII는 사용 된 인코딩 제품군에 관계없이 영향을받지 않습니다.

이 인코딩 체계의 단점은 128 개 이상의 기호로 구성된 언어를 수용 할 수 없거나 한 번에 두 개 이상의 기호 계열을 안전하게 표시 할 수 없다는 것입니다. 또한 ISO-8859 인코딩은 UTF의 등장으로 호의를 얻지 못했습니다. 2004 년에 해체 된 책임을 맡고있는 ISO "작업반 (Working Group)"은 부모 소위원회까지 유지 보수를 맡겼습니다.


1
질문에 대답하지만 관련 인코딩에 대한 정보를 제공하고 정보를 제공하는 +1 Re : UTF-8의 코드 포인트는 stackoverflow.com/a/38488358/3353984 에 따르면 2 ^ 21 코드 포인트를 지원합니다. 오류입니까, 아니면 수정이 필요한가요?
Tom Loredo

1
유니 코드는 실제로 2 ^ 16 코드 포인트의 17 개 평면입니다. 0x00_0000 ~ 0x1F_FFFF 17 개의 평면은 1,114,112 개의 코드 포인트를 수용 할 수 있습니다. 이 중 2,048 명은 대리모이고 66 명은 비 캐릭터이며 137,468 명은 개인용으로 예약되어 있으며 974,530 명은 공개 할당으로 약 1 백만 명입니다. UTF-8로 인코딩 할 수있는 문자 수를 참조하십시오 . .
georgeawg

22
  • 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'

21

ISO-8859-1은 1980 년대의 레거시 표준입니다. 256 자만 표현할 수 있으므로 서구의 일부 언어에만 적합합니다. 지원되는 많은 언어의 경우에도 일부 문자가 누락되었습니다. 이 인코딩으로 텍스트 파일을 만들고 일부 한자를 복사 / 붙여 넣기를 시도하면 이상한 결과가 나타납니다. 즉, 사용하지 마십시오. 유니 코드는 전 세계를 장악했으며 UTF-8은 요즘의 모든 이유 (예 : 모든 것과 호환되어야하는 HTTP 헤더)가없는 한 거의 표준입니다.


1
Umlaut이 UTF8로 변환되지 않은 곳을 보았습니다. 우리는 이것의 예를 보았고 검색에서 ISO-8859-1을 찾았으며 작동하는 것 같습니다. 우리는 많은 독일 과학자와 함께 일하고 있습니다.
Aggie Jon

4
Umlaut은 utf8에서 두 문자로 표시됩니다. 그들은 잘 변환하고 잘 작동합니다. 문제는 문자 당 1 바이트를 예상하는 프로그램에서 발생합니다. 이러한 레거시 프로그램의 경우 ISO-8859-1에는 1 바이트 움라우트가 있습니다.
Erik Aronesty

3

다른 관점에서, 유니 코드 및 ASCII 인코딩이 모두 바이트 0xc0를 가지고있어 읽지 못하는 파일은 iso-8859-1에 의해 올바르게 읽히는 것 같습니다. 주의 사항은 물론 파일에 유니 코드 문자가 없어야한다는 것입니다.


2

실현해야 할 또 하나의 중요한 사항 :이 경우 ISO / IEC 8859-1 대신 Windows-1252 를 참조 iso-8859-1하는 것입니다 . ISO 8859-1에는 C1 제어 코드가 있고 Windows-1252에는 유용한 가시 문자가있는 0x80–0x9F 범위가 다릅니다.

예를 들어 ISO 8859-1은 0x85를 제어 문자 (유니 코드, U + 0085,``)로, Windows-1252는 가로 줄임표 (Unicode, U + 2026 HORIZONTAL ELLIPSIS, )를 갖습니다 .

WHATWG 인코딩 사양 (HTML에서 사용)를 명시 적으로 선언 iso-8859-1에 대한 레이블로 windows-1252, 웹 브라우저는 어떤 방식으로 ISO 8859을 지원하지 않습니다 다음 HTML 사양은 인코딩 사양의 모든 인코딩 지원, 더 이상되어야 함을 말한다 .

또한 HTML 숫자 참조는 기본적으로 유니 코드 코드 포인트가 아닌 8 비트 값에 Windows-1252를 사용합니다. https://html.spec.whatwg.org/#numeric-character-reference-end-state 에 따라 …U + 0085 대신 U + 2026이 생성됩니다.


죄송합니다! 나는 그것을 쓸 것이라고 생각했지만 다시 작성하면서 그것을 잃어 버렸습니다. 지금 넣었습니다.
크리스 모건

0

이 질문을 조사한 이유는 관점에서 볼 때 어떤 방식으로 호환되는지입니다. Latin1 문자 세트 (iso-8859)는 utf8 데이터 저장소에 저장하기 위해 100 % 호환됩니다. 모든 ASCII 및 확장 ASCII 문자는 1 바이트로 저장됩니다.

다른 방법으로 utf8에서 Latin1 문자 세트로 이동하면 작동하지 않을 수 있습니다. 2 바이트 문자 (확장 ASCII 255를 초과하는 문자)가 있으면 Latin1 데이터 저장소에 저장되지 않습니다.


2
도움이되지만 확장 ASCII 255에서 255 대신 127을 의미한다고 생각합니까?
Hydroper

18
Latin-1 또는 iso-8859-1은 utf8에 저장하기 위해 100 % 호환되지 않습니다. 127 이상의 Latin-n 또는 iso-8859-n 문자는 단일 바이트 utf-8 문자로 변환되지 않습니다. 그러나 값 1-127의 경우 정확하게 변환됩니다.
말린 피어스

4
이 답변은 "확장 ASCII"라는 용어를 사용하는 데 약간 혼란 스럽습니다. 이는 ASCII가 아닌 문자 인코딩을 나타내는 용어 일뿐입니다. UTF-8 및 latin-1은 확장 ASCII 인코딩의 예입니다. 그러나 ASCII가 아닌 라틴 -1 문자 (예 : 127 이상의 코드 포인트)는 UTF-8에서 단일 바이트로 인코딩 할 수 없습니다.
rdb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.