>  기사  >  백엔드 개발  >  ASCII, 유니코드 및 UTF-8을 인코딩하는 문자 세트에 대해 얼마나 알고 계십니까? 문자 세트 인코딩 요약(컬렉션)

ASCII, 유니코드 및 UTF-8을 인코딩하는 문자 세트에 대해 얼마나 알고 계십니까? 문자 세트 인코딩 요약(컬렉션)

寻∝梦
寻∝梦원래의
2018-08-31 11:22:282572검색

ASCII, 유니코드 및 UTF-8을 인코딩하는 문자 집합에 대해 얼마나 알고 있나요? 이 기사에서는 문자 세트 인코딩에 대한 철저한 이해를 제공합니다. 이 기사에서는 ASCII, 유니코드 및 UTF-8 인코딩 문제와 변환은 물론 예제 분석을 소개합니다. 기사 읽기 시작

1. ASCII 코드

우리는 컴퓨터 내부의 모든 정보가 궁극적으로 이진 값이라는 것을 알고 있습니다. 각 이진 비트(비트)는 0과 1의 두 가지 상태를 가지므로 8개의 이진 비트를 바이트라고 하는 256개의 상태로 결합할 수 있습니다. 즉, 1바이트는 총 256개의 서로 다른 상태를 표현할 수 있으며, 각 상태는 00000000부터 11111111까지 256개의 기호로 구성된 하나의 기호에 해당한다.

1960년대 미국은 영어 문자와 이진 비트 간의 관계를 통합하는 일련의 문자 인코딩을 공식화했습니다. 이것은 ASCII라고 불리며 오늘날에도 여전히 사용되고 있습니다.

ASCII 코드는 총 128개의 문자 인코딩을 지정합니다. 예를 들어 SPACE는 32(이진수 00100000)이고 대문자 A는 65(이진수 01000001)입니다. 이 128개 기호(인쇄할 수 없는 32개 제어 기호 포함)는 바이트의 마지막 7비트만 차지하며 첫 번째 비트는 균일하게 0으로 설정됩니다.

ASCII 제어 문자

ASCII, 유니코드 및 UTF-8을 인코딩하는 문자 세트에 대해 얼마나 알고 계십니까? 문자 세트 인코딩 요약(컬렉션)

ASCII 표시 가능 문자

ASCII, 유니코드 및 UTF-8을 인코딩하는 문자 세트에 대해 얼마나 알고 계십니까? 문자 세트 인코딩 요약(컬렉션)

2. 비ASCII 인코딩

128개 기호로 영어 인코딩이면 충분합니다. 하지만 다른 언어를 나타내는 데 사용됩니다. , 128개의 기호로는 충분하지 않습니다. 예를 들어 프랑스어에서는 문자 위에 발음 기호가 있으면 ASCII 코드로 표현할 수 없습니다. 결과적으로 일부 유럽 국가에서는 바이트의 유휴 최고 비트를 사용하여 새 기호를 인코딩하기로 결정했습니다. 예를 들어 프랑스어에서 é의 인코딩은 130(이진수 10000010)입니다. 결과적으로 이러한 유럽 국가에서 사용되는 인코딩 시스템은 최대 256개의 기호를 나타낼 수 있습니다.

그러나 여기서 새로운 문제가 발생합니다. 국가마다 알파벳이 다르므로 모두 256 기호 인코딩을 사용하더라도 나타내는 문자가 다릅니다. 예를 들어, 130은 프랑스어 인코딩에서 é를 나타내고, 히브리어 인코딩에서 문자 Gimel(ג)을 나타내고, 러시아어 인코딩에서는 또 다른 기호를 나타냅니다. 하지만 어찌 됐든 이 모든 인코딩 방법에서 0~127로 표시되는 기호는 동일하며 유일한 차이점은 섹션 128~255입니다.

아시아 국가의 문자는 기호가 더 많아 무려 10만 개의 한자가 사용됩니다. 1바이트는 256개의 기호만 표현할 수 있으므로 하나의 기호를 표현하려면 여러 바이트를 사용해야 합니다. 예를 들어, 중국어 간체의 일반적인 인코딩 방법은 GB2312이며, 이는 한자를 표현하기 위해 2바이트를 사용하므로 이론적으로 최대 256 x 256 = 65536개의 기호를 표현할 수 있습니다.

중국어 인코딩 문제를 논의하려면 특별한 기사가 필요하며 이 노트에서는 다루지 않습니다. 여기서는 기호를 표현하기 위해 여러 바이트가 사용되지만 GB 클래스의 한자 인코딩은 나중에 설명하는 유니코드 및 UTF-8과 아무 관련이 없다는 점만 지적합니다.

3. 유니코드

이전 섹션에서 언급했듯이 세상에는 다양한 인코딩 방법이 있으며 동일한 이진수라도 다른 기호로 해석될 수 있습니다. 따라서 텍스트 파일을 열려면 해당 인코딩 방법을 알아야 합니다. 그렇지 않으면 잘못된 인코딩 방법을 사용하여 해석하면 잘못된 문자가 나타납니다. 이메일이 종종 왜곡되는 이유는 무엇입니까? 이는 보내는 사람과 받는 사람이 서로 다른 인코딩 방법을 사용하기 때문입니다.

세상의 모든 기호를 포함하는 코드가 있다면 상상할 수 있습니다. 각 기호에는 고유한 코드가 부여되어 문자 깨짐 문제가 사라집니다. 이것은 이름에서 알 수 있듯이 모든 기호의 인코딩인 유니코드입니다.

유니코드는 물론 현재 1백만 개 이상의 기호를 수용할 수 있는 규모의 대규모 컬렉션입니다. 예를 들어, U+0639는 아랍어 문자 Ain을 나타내고, U+0041은 영어 대문자 A를 나타내고, U+4E25는 한자 Yan을 나타냅니다. 특정 기호 대응표에 대해서는 unicode.org 또는 전문 한자 대응표를 확인할 수 있습니다.

4. 유니코드 문제

유니코드는 단지 기호 집합일 뿐이며 이 이진 코드를 저장하는 방법은 지정하지 않습니다.

예를 들어 한자 Yan의 유니코드는 16진수 4E25이며, 이를 15자리의 이진수(100111000100101)로 변환합니다. 즉, 이 기호를 표현하려면 최소 2바이트가 필요합니다. 다른 더 큰 기호를 표현하려면 3바이트, 4바이트 또는 그 이상이 필요할 수 있습니다.

여기에는 두 가지 심각한 문제가 있습니다 첫 번째 질문은 유니코드와 ASCII를 구별하는 방법입니다. 3바이트가 3개의 개별 기호가 아닌 하나의 기호를 나타낸다는 것을 컴퓨터는 어떻게 알 수 있습니까? 두 번째 문제는 영어 문자를 표현하는 데 1바이트만 있으면 충분하다는 것을 이미 알고 있다는 것입니다. 유니코드에서 각 기호가 3~4바이트로 표현된다고 균일하게 규정하면 각 영어 문자 앞에는 2개의 문자가 와야 합니다. 이는 엄청난 저장 공간 낭비이고, 텍스트 파일의 크기도 2~3배 커지게 되어 용납할 수 없습니다.

이로 인해 발생하는 결과는 다음과 같습니다: 1) 유니코드의 여러 저장 방법이 등장했습니다. 이는 유니코드를 나타내는 데 사용할 수 있는 다양한 바이너리 형식이 있음을 의미합니다. 2) 유니코드는 인터넷이 등장하기 전까지 오랫동안 홍보될 수 없었습니다.

5. UTF-8

인터넷의 인기로 인해 통합 인코딩 방법의 출현이 절실히 필요합니다. UTF-8은 인터넷에서 가장 널리 사용되는 유니코드 구현입니다. 다른 구현에는 UTF-16(문자는 2바이트 또는 4바이트로 표시됨) 및 UTF-32(문자는 4바이트로 표시됨)가 포함되지만 인터넷에서는 거의 사용되지 않습니다. 여기서도 UTF-8은 유니코드의 구현이라는 점과 관련이 있습니다.

UTF-8의 가장 큰 특징 중 하나는 가변 길이 인코딩 방식이라는 점입니다. 기호를 표현하기 위해 1~4바이트를 사용할 수 있으며, 바이트 길이는 기호에 따라 다릅니다.

UTF-8 인코딩 규칙 은 매우 간단하며 다음 두 가지만 있습니다.

1 단일 바이트 기호의 경우 바이트의 첫 번째 비트는 0으로 설정되고 다음 7비트는 이 유니코드 코드입니다. 상징. 따라서 영문자의 경우 UTF-8 인코딩과 ASCII 인코딩이 동일합니다.

2 n바이트 기호(n > 1)의 경우 첫 번째 바이트의 처음 n 비트는 1로 설정되고 n + 1번째 비트는 0으로 설정되며 다음 바이트의 처음 2비트가 설정됩니다. 10으로. 언급되지 않은 나머지 이진 비트는 모두 이 기호의 유니코드 코드입니다.

다음 표에는 인코딩 규칙이 요약되어 있으며 문자 x는 사용 가능한 인코딩 비트를 나타냅니다.

ASCII, 유니코드 및 UTF-8을 인코딩하는 문자 세트에 대해 얼마나 알고 계십니까? 문자 세트 인코딩 요약(컬렉션)

위 표에 따르면 UTF-8 인코딩을 해석하는 것은 매우 간단합니다. 바이트의 첫 번째 비트가 0이면 해당 바이트만 문자입니다. 첫 번째 비트가 1이면 연속되는 1의 수는 현재 문자가 차지하는 바이트 수를 나타냅니다.

다음으로 UTF-8 인코딩을 구현하는 방법을 보여주기 위해 중국어 문자 Yan을 예로 들어보겠습니다.

Yan의 유니코드는 4E25(100111000100101)입니다. 위 표에 따르면 4E25는 세 번째 줄(0000 0800 - 0000 FFFF) 범위에 있으므로 Yan의 UTF-8 인코딩에는 3바이트가 필요합니다. , 형식은 1110xxxx 10xxxxxx 10xxxxxx입니다. 그런 다음 Yan의 마지막 이진수부터 시작하여 형식에 따라 x를 뒤에서 앞으로 채우고 나머지 비트는 0으로 채웁니다. 이러한 방식으로 Yan의 UTF-8 인코딩은 11100100 10111000 10100101이고 16진수로 변환된 것은 E4B8A5라는 것을 알 수 있습니다.

6. 유니코드와 UTF-8 간의 변환

이전 섹션의 예를 통해 Yan의 유니코드 코드는 4E25이고 UTF-8 인코딩은 E4B8A5라는 것을 알 수 있습니다. 이들 간의 변환은 프로그램을 통해 이루어질 수 있습니다.

Windows 플랫폼의 경우 가장 간단한 변환 방법 중 하나는 내장된 메모장 애플릿 notepad.exe를 사용하는 것입니다. 파일을 연 후 파일 메뉴에서 다른 이름으로 저장 명령을 클릭하면 하단에 코딩 드롭다운 바가 있는 대화상자가 나타납니다.

ASCII, 유니코드 및 UTF-8을 인코딩하는 문자 세트에 대해 얼마나 알고 계십니까? 문자 세트 인코딩 요약(컬렉션)

내부에는 ANSI, 유니코드, 유니코드 빅엔디안 및 UTF-8의 네 가지 옵션이 있습니다.

  • ANSI가 기본 인코딩입니다. 영어 파일의 경우 ASCII 인코딩, 중국어 간체 파일의 경우 GB2312 인코딩입니다(Windows 중국어 간체 버전만 해당, 중국어 번체 버전인 경우 Big5 코드 사용).

  • 여기서 유니코드 인코딩은 notepad.exe에서 사용하는 UCS-2 인코딩 방법을 의미하며, 2바이트를 직접 사용하여 문자의 유니코드 코드를 저장합니다. 이 옵션은 리틀 엔디안 형식을 사용합니다.

  • 유니코드 빅엔디안 인코딩은 이전 옵션에 해당합니다. 리틀 엔디안과 빅 엔디안의 의미에 대해서는 다음 장에서 설명하겠습니다.

  • UTF-8 인코딩은 이전 섹션에서 언급한 인코딩 방법입니다.

"인코딩 방법"을 선택한 후 "저장" 버튼을 클릭하면 파일의 인코딩 방법이 즉시 변환됩니다.

Seven, Little endian 및 Big endian

이전 섹션에서 언급했듯이 UCS-2 형식은 유니코드 코드를 저장할 수 있습니다(코드 포인트는 0xFFFF를 초과하지 않음). 중국 문자 Yan을 예로 들면 유니코드 코드는 4E25이고 2바이트로 저장되어야 하며, 한 바이트는 4E이고 다른 바이트는 25입니다. 보관할 때 4E가 앞쪽에 있고 25가 뒤쪽에 있는 빅 엔디안 방식이며, 25가 앞쪽에 있고 4E가 뒤쪽에 있는 리틀 엔디안 방식입니다.

이 두 가지 이상한 이름은 영국 작가 스위프트의 "걸리버 여행기"에서 따왔습니다. 책에서는 릴리푸트에서 내전이 발발했는데, 전쟁의 원인은 빅엔디안인지 리틀엔디안인지를 두고 사람들이 벌이는 논쟁이었다. 이 사건으로 인해 6번의 전쟁이 발발하여 한 황제가 목숨을 잃었고, 또 다른 황제가 왕좌를 잃었습니다.

첫 번째 바이트인 "빅 엔디안"이 먼저 오고, 두 번째 바이트인 "리틀 엔디안"이 먼저 옵니다.

그러면 자연스럽게 다음과 같은 질문이 생길 것입니다. 컴퓨터는 특정 파일에 어떤 인코딩 방법이 사용되는지 어떻게 알 수 있을까요?

유니코드 사양에서는 인코딩 순서를 나타내는 문자가 각 파일의 앞에 추가된다고 정의합니다. 이 문자의 이름은 FEFF로 표시되는 "제로 너비 중단 없음 공백"(제로 너비 중단 없음 공백)입니다. 이는 정확히 2바이트이고 FF는 FE보다 1바이트 더 큽니다.

텍스트 파일의 처음 2바이트가 FE FF이면 파일이 빅엔디안 모드를 사용한다는 의미이고, 처음 2바이트가 FF FE이면 파일이 스몰엔디안 모드를 사용한다는 의미입니다.

8. 예시

아래에 예시를 들어보세요.

"메모장" 프로그램인 notepad.exe를 열고 새 텍스트 파일을 만듭니다. 내용은 "yan"이라는 단어로, ANSI, 유니코드, 유니코드 빅 엔디안 및 UTF-8 인코딩으로 저장합니다.

그런 다음 텍스트 편집 소프트웨어 UltraEdit의 "Hex Function"을 사용하여 파일의 내부 인코딩을 관찰하세요.

  • ANSI: 파일 인코딩은 Yan의 GB2312 인코딩인 2바이트 D1 CF입니다. 이는 GB2312가 빅 헤드 모드에 저장되어 있음을 의미합니다.

  • 유니코드: 인코딩은 4바이트 FF FE 25 4E입니다. 여기서 FF FE는 작은 헤더 모드에 저장되었음을 나타내며 실제 인코딩은 4E25입니다.

  • 유니코드 빅 엔디안: 인코딩은 4바이트 FE FF 4E 25입니다. 여기서 FE FF는 빅 엔드 스토리지를 나타냅니다.

  • UTF-8: 인코딩은 6바이트 EF BB BF E4 B8 A5입니다. 처음 3바이트 EF BB BF는 이것이 UTF-8 인코딩임을 나타내고 마지막 3바이트 E4B8A5는 해당 저장 순서입니다. 인코딩 순서와 일치합니다.

9. 확장 읽기(과외 지식)

모든 소프트웨어 개발자가 반드시, 적극적으로 알아야 하는 유니코드 및 문자 집합에 대해 알아야 할 최소값(문자 집합에 대한 가장 기본적인 지식)

유니코드 인코딩에 대해 이야기해 보세요. RFC3629: UTF-8, ISO 10646의 변환 형식(UTF-8 조항이 구현된 경우)

위 내용은 ASCII, 유니코드 및 UTF-8을 인코딩하는 문자 세트에 대해 얼마나 알고 계십니까? 문자 세트 인코딩 요약(컬렉션)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.