컴퓨터 지식 네트워크 - 컴퓨터 제품 - 인코딩 방법 인코딩 방법

인코딩 방법 인코딩 방법

일반적인 인코딩 특성을 이해하는 것은 문자 집합 인코딩 문제를 해결하는 기초입니다. 문자 세트 인코딩의 식별 및 변환, 다양한 문자 왜곡의 원인 분석, 다양한 인코딩된 문자열의 프로그래밍 작업(문자 수 계산, 잘림 처리 등) 등 모두 인코딩의 특성을 이해해야 합니다.

문자 집합 인코딩에 대한 이해는 주로 해당 인코딩의 인코딩 범위, 해당 인코딩에 해당하는 문자 집합(어떤 문자가 포함되어 있는지), 다른 문자 집합 인코딩 간의 관계 등을 이해하는 것입니다.

ASCII

ASCII 코드는 7비트 코드이며, 코딩 범위는 0x00~0x7F이다. ASCII 문자 집합에는 영문자, 아라비아 숫자, 구두점 등의 문자가 포함됩니다. 그 중 0x00-0x1F와 0x7F***는 33개의 제어문자이다.

ASCII 코드만 지원하는 시스템은 각 바이트의 최상위 비트를 무시하고 하위 7비트만 유효한 비트로 간주합니다. HZ 문자 인코딩은 7비트 ASCII만 지원하는 시스템에서 중국어를 전송하도록 설계된 초기 인코딩입니다. 초기에는 많은 이메일 시스템이 ASCII 인코딩만 지원했지만 중국어 이메일을 전송하려면 BASE64 또는 기타 인코딩 방법을 사용해야 했습니다.

GB2312

GB2312는 지역 코드를 기반으로 설계되었으며 지역 코드는 코딩 테이블을 94개 영역으로 나누고 각 영역은 94비트에 해당하며 지역 코드와 비트 수는 다음과 같습니다. 각 문자의 조합은 한자의 위치코드입니다. 지역번호는 일반적으로 10진수로 표시됩니다. 예를 들어 1601은 16영역의 1자리를 의미하며 해당 문자는 "ah"입니다. GB2312 인코딩을 얻으려면 지역 코드와 지역 코드의 비트 번호에 0xA0을 추가하십시오.

지역번호 중 01~09 영역은 기호와 숫자, 16~87 영역은 한자 영역, 10~15, 88~94 영역은 정의되지 않은 공백 영역입니다. 수집된 한자를 두 가지 수준으로 나눕니다. 첫 번째 수준에는 일반적으로 사용되는 3,755개의 한자가 포함되어 있으며, 이는 16-55 영역에 배치되어 한어 병음/획 모양의 순서로 배열되어 있습니다. 56~87자리에 부수/획순으로 배열된 한자. 1급 한자는 병음에 따라 정렬된다. 이는 1급 한자 위치에서 특정 병음의 범위를 알아내는 데 사용될 수 있다.

GB2312 문자 세트에는 일반적으로 사용되는 간체 한자 외에도 그리스 문자, 일본어 히라가나 및 가타카나 문자, 러시아어 키릴 문자 및 기타 한자 문자가 포함되며 일부 희귀 문자는 포함되지 않습니다. 중국어 번체 문자를 사용하여 일부 시스템이 GB2312 인코딩만 지원하는지 테스트할 수 있습니다.

GB2312의 인코딩 범위는 0xA1A1-0xFEFE입니다. 정의되지 않은 영역을 제거하면 실제 인코딩 범위는 0xA1A1-0xF7FE임을 알 수 있습니다.

EUC-CN은 GB2312의 별칭으로 이해하면 GB2312와 완전히 동일합니다.

위치 코드는 포함된 문자와 문자 위치를 정의하는 문자 세트의 정의로 간주되어야 합니다. GB2312 및 EUC-CN은 실제 컴퓨터 환경에서 이 문자 세트를 지원하는 코드입니다. HZ 및 ISO-2022-CN은 위치 코드 문자 집합에 해당하는 다른 두 가지 인코딩입니다. 둘 다 중국어 문자를 지원하기 위해 7비트 인코딩 공간을 사용합니다. 위치 코드와 GB2312 인코딩 간의 관계는 유니코드 및 UTF-8과 약간 비슷합니다.

GBK

GBK 인코딩은 GB2312 인코딩의 상위 집합이며 GB2312와 완전히 역호환됩니다. 동시에 GBK는 유니코드 기본 다국어 평면에 모든 CJK 중국어 문자를 포함합니다. GB2312와 마찬가지로 GBK도 그리스 문자, 일본어 가나 문자, 러시아어 문자 및 기타 문자를 지원하지만 한국어의 발음 문자(한자가 아닌 문자)는 지원하지 않습니다. GBK에는 중국어 부수 기호, 세로 구두점 및 GB2312에 포함되지 않은 기타 문자도 포함됩니다.

GBK의 전체 인코딩 범위는 하위 바이트 0×7F 조합을 제외한 0x8140-0xFEFE입니다. 상위 바이트 범위는 0×81-0xFE이고 하위 바이트 범위는 0x40-7E 및 0x80-0xFE입니다.

하위 바이트가 0x40-0x7E인 GBK 문자는 특정 특수성을 갖고 있습니다. 왜냐하면 이러한 문자는 ASCII 코드 위치를 차지하므로 일부 시스템에 문제를 일으킬 수 있기 때문입니다.

일부 시스템에서는 0x40-0x7E(예: "|")의 문자를 특수 기호로 사용하며 이러한 기호를 찾을 때 특정 GBK 문자의 하위 바이트에 속하는지 여부를 확인하지 않습니다. 방법은 잘못된 판단으로 이어질 것입니다. GB2312를 지원하는 환경에서는 이 문제가 발생하지 않습니다. GBK를 지원하는 환경에서는 0x80보다 작은 바이트는 ASCII 기호가 아닐 수 있습니다. 또한 0x40보다 작은 ASCII 기호를 사용하여 일부 특수 기호를 만드는 것이 가장 좋습니다. 특정 기호인지 걱정하지 않고 찾아보세요. Big5 인코딩에도 해당 문제가 존재합니다.

CP936과 GBK 사이에는 약간의 차이가 있습니다. 대부분의 경우 CP936은 GBK의 별칭으로 사용될 수 있습니다.

GB18030

GB18030 인코딩은 GBK 및 GB2312와 호환됩니다. 호환성이란 문자가 호환될 뿐만 아니라 동일한 문자의 인코딩도 동일하다는 것을 의미합니다. GB18030에는 중국 소수자 문자, GBK에서 지원하지 않는 한국어 문자 등을 포함한 Unicode3.1의 모든 문자가 포함되어 있습니다. 또한 전 세계 대부분의 소수 민족의 텍스트 기호가 포함되어 있다고 할 수 있습니다.

GBK와 GB2312는 모두 2바이트 동일 너비 인코딩입니다. ASCII 호환성이 지원되는 1바이트를 포함하면 1바이트와 2바이트를 혼합한 가변 길이 인코딩으로도 이해될 수 있습니다. 바이트. GB18030 인코딩은 단일 바이트, 더블 바이트 및 4바이트의 세 가지 모드가 있는 가변 길이 인코딩입니다.

GB18030의 단일 바이트 인코딩 범위는 0x00-0x7F이며 이는 ASCII와 완전히 동일합니다. 더블 바이트 인코딩 범위는 GBK와 동일하며 상위 바이트는 0x81-0xFE이고 하위 바이트는 바이트 인코딩 범위는 0x40 -0x7E 및 0x80-FE입니다. 4바이트 인코딩에서 첫 번째 및 세 번째 바이트의 인코딩 범위는 0x81-0xFE이고 두 번째 및 네 번째 바이트는 0x30-0x39입니다.

Windows의 CP936 코드 페이지는 0x80을 사용하여 유로 기호를 나타내지만 GB18030 인코딩에서는 0x80 인코딩 비트를 사용하지 않고 다른 위치를 사용하여 유로 기호를 나타냅니다. 이는 GB18030의 하위 호환성에 대한 작은 문제로 이해될 수 있습니다. 0x80은 CP936에서 GBK로의 확장인 반면 GB18030은 GBK와만 잘 호환된다는 것도 이해할 수 있습니다.

BIG5

Big5는 더블바이트 인코딩이며, 상위 바이트 인코딩 범위는 0x81-0xFE이고, 하위 바이트 인코딩 범위는 0x40-0x7E 및 0xA1-0xFE입니다. GBK와 비교할 때 누락된 하위 바이트는 0x80-0xA0의 조합입니다. 0x8140-0xA0FE는 사용자가 만든 문자를 위해 예약된 영역입니다.

Big5에 포함된 한자는 간체자가 아닌 번체자만 포함되며, 일부 희귀한자는 포함되지 않습니다. GBK에 포함된 일본어 가나 문자와 러시아어 문자 Big5도 포함되지 않습니다. Big5에 포함되는 문자가 제한되어 있기 때문에 이티안 중국어 시스템과 같이 Big5에서 확장되는 코드가 많이 있습니다. Windows 시스템에서 사용되는 코드 페이지 CP950은 Big5를 기반으로 7개의 한자와 일부 기호를 추가하는 Big5의 확장으로 이해될 수도 있습니다. Big5 인코딩에 해당하는 문자 집합은 GBK 문자 집합의 하위 집합으로, Big5에 포함된 문자는 GBK에 포함된 문자의 일부이지만 동일한 문자라도 인코딩이 다른 것을 의미합니다.

Big5도 ASCII 인코딩 공간(하위 바이트가 사용하는 0x40-0x7E)을 점유하기 때문에 일부 환경에서는 Big5 인코딩도 GBK 인코딩과 동일한 문제가 있습니다. 즉, 하위 바이트 범위가 0x40 문자입니다. -0x7E의 문자, 특히 하위 바이트가 0x5C("/") 및 0x7C("|")인 문자는 잘못 처리될 수 있습니다. GBK 섹션에서 해당 지침을 참조할 수 있습니다.

몇 가지 차이점은 있지만 대부분의 경우 CP950은 Big5의 별칭으로 간주될 수 있습니다.

ISO-8859-1

ISO-8859-1 인코딩은 단일 바이트 인코딩이며 ASCII와 역호환되며 인코딩 범위는 0x00-0xFF이고 전체 범위는 0x00-0x7F ASCII와 일치하며 0x80-0x9F는 제어 문자이고 0xA0-0xFF는 텍스트 기호입니다.

ASCII에 포함된 문자 외에도 ISO-8859-1에 포함된 문자에는 서유럽 언어, 그리스어, 태국어, 아랍어 및 히브리어에 해당하는 텍스트 기호도 포함됩니다. 유로 기호는 상대적으로 늦게 등장하여 ISO-8859-1에 포함되지 않습니다.

ISO-8859-1 인코딩 범위는 단일 바이트 내의 모든 공간을 사용하기 때문에 ISO-8859-1을 지원하는 시스템에 전송 및 저장될 때 다른 인코딩 바이트 스트림은 삭제되지 않습니다. 즉, 다른 인코딩된 바이트 스트림을 ISO-8859-1 인코딩으로 처리하는 데 문제가 없습니다. 이것은 매우 중요한 기능입니다. MySQL 데이터베이스의 기본 인코딩은 이 기능을 활용하는 Latin1입니다. ASCII 인코딩은 7비트 컨테이너이고 ISO-8859-1 인코딩은 8비트 컨테이너입니다.

Latin1은 ISO-8859-1의 별칭이며 일부 환경에서는 Latin-1로 작성됩니다.

UCS-2 및 UTF-16

유니코드 조직과 ISO 조직 모두 모든 언어에서 사용되는 문자를 포괄할 목적으로 매우 큰 문자 집합을 정의하려고 합니다. ​다른 분야에서 사용되는 일부 특수 문자와 함께 이 문자 집합은 범용 문자 집합(UCS, Universal Character Set)입니다. 두 조직이 조율되어 독립적으로 발전하고 있지만 정의된 캐릭터 포지션은 완전히 일치한다. 해당 ISO 표준은 ISO 10646입니다. 유니코드와 ISO 10646은 모두 지속적인 개발 과정에 있으므로 다양한 개발 단계를 나타내는 다양한 버전 번호가 있으며 각 유니코드 버전 번호에 해당하는 ISO 10646 버전 번호를 찾을 수 있습니다.

ISO 10646 표준은 31비트 문자 집합을 정의합니다. 처음 2바이트(0x0000-0xFFFD)의 위치를 ​​BMP(Basic Multilingual Plane)라고 하며, 2바이트 이후의 범위를 보조 언어 평면이라고 합니다. BMP는 기본적으로 모든 언어의 대부분의 문자를 포함하므로 BMP가 지원되는 한 대부분의 상황에서 응용 프로그램을 지원할 수 있습니다. Unicode 3.0에 해당하는 문자 집합은 BMP 범위 내에 있습니다.

UCS 문자 세트는 각 문자에 위치를 할당합니다. 일반적으로 "U"와 UCS의 문자 위치에 대한 16진수를 사용하여 이 문자의 UCS 표현을 사용합니다. 예를 들어 "U+ 0041"은 문자를 나타냅니다. "에이". UCS 문자 U+0000 ~ U+00FF는 ISO-8859-1과 완전히 동일합니다.

UCS-2 및 UTF-16은 UCS 문자 집합(또는 유니코드 문자 집합)의 실제 응용 프로그램에 사용되는 특정 인코딩 방법입니다. UCS-2는 2바이트의 동일 너비 인코딩이므로 2바이트의 인코딩 공간만 사용하므로 BMP의 문자만 인코딩할 수 있습니다. UTF-16은 BMP의 문자를 인코딩하는 데 2바이트를 사용하고 BMP 범위를 벗어나는 보조 평면의 문자를 인코딩하는 데 4바이트를 사용하는 가변 길이 인코딩입니다.

UCS-2는 GBK 및 Big5와 다릅니다. 이는 진정한 동일 너비 인코딩입니다. 각 문자는 2바이트를 사용합니다. 이 기능은 문자열 잘림 및 문자 수 계산에 매우 편리합니다.

UTF-16은 UCS-2의 상위 집합입니다. UTF-16의 2바이트 인코딩 방법은 UCS-2와 완전히 동일합니다. 즉, BMP 프레임워크 내에서는 UCS- 2는 UTF -16과 완전히 동일합니다. 실제로 UCS-16은 UCS-2의 별칭으로 사용되는 경우가 많습니다.

UCS-2와 UTF-16은 저장하고 전송할 때 두 가지 다른 바이트 순서, 즉 빅 엔디안과 리틀 엔디안(빅 엔디안과 리틀 엔디안)을 사용합니다. 예를 들어 "ah"(U+554A)는 빅엔디안으로 0x554A로 표현되고, 리틀엔디안은 0x4A55로 표현됩니다. UCS-2 및 UTF-16의 기본 바이트 순서는 빅 엔디안입니다. 전송 과정에서 바이트 순서를 나타내기 위해서는 바이트 스트림 앞에 BOM(Byte order Mark)을 추가해야 합니다. 0xFEFF는 빅 엔디안을 나타내고, 0xFFFE는 리틀 엔디안을 나타냅니다.

UCS-2BE 및 UCS-2LE는 UTF-16BE 및 UTF-16LE와 마찬가지로 빅 엔디안 및 리틀 엔디안에 해당하는 실제 응용 프로그램에서 사용되는 인코딩 이름입니다. 기본값은 BE 바이트 순서이므로 UCS-2는 UCS-2BE의 별칭으로 간주될 수 있습니다.

UCS 인코딩에는 "ZERO WIDTH NO-break SPACE"라는 문자가 있는데, 그 인코딩은 U+FEFF로 실제 의미가 없는 문자입니다. UCS 사양에서는 바이트 스트림을 전송하기 전에 "ZERO WIDTH NO-break SPACE" 문자를 전송할 것을 권장합니다. 전송된 ZERO WIDTH NO-break SPACE가 0xFEFF이면 빅 엔디안을 의미하고, 그렇지 않으면 리틀 엔디안을 의미합니다.

UCS-2 및 UTF-16은 ASCII 및 ISO-8859-1과 호환되는 것으로 이해될 수도 있습니다. ASCII 인코딩 또는 ISO-8859-1 인코딩에서 각 바이트 앞에 0x00을 추가하면 UCS가 표시됩니다. -2 해당 문자의 인코딩.

UCS-2 및 UTF-16은 특정 문자 인코딩의 일부로 0x00을 사용합니다. 일부 시스템에서는 UCS-2 또는 UTF-16 인코딩을 처리할 때 문자열 끝의 표시로 0x00을 사용합니다. 문제가 발생합니다.

UTF-8

UTF-8은 UCS 문자 집합의 또 다른 인코딩 방법입니다. UTF-16의 각 단위는 2바이트(16비트)인 반면, UTF는 -의 각 단위입니다. 8은 바이트(8비트)입니다. UTF-16에서는 1바이트 또는 2바이트의 더블 바이트를 사용하고, UTF-8에서는 1바이트 또는 여러 개의 싱글 바이트를 사용하여 문자를 표현합니다.

UTF-8 인코딩은 특정 규칙에 따라 UCS-2에서 변환된다고 볼 수 있습니다. UCS-2와 UTF-8 사이에는 다음과 같은 변환 관계가 있습니다.

UCS -2 UTF-8

U+0000 - U+007F 0xxxxxxx

U+0080 - U+07FF 110xxxxx 10xxxxxx

U+0800 - U+FFFF 1110xxxx 10xxxxxx 10xxxxxx

예를 들어 단어 "ah"의 UCS-2 인코딩은 0x554A이고 해당 바이너리는 0101 0101 0100 1010입니다. UTF-8 인코딩으로 변환한 후 바이너리는 1110 0101 10입니다. 010101 10 001010 및 해당 10의 16진수 값은 0xE5958A입니다.

UCS-4는 UCS 문자 집합의 인코딩 방법이기도 합니다. UCS-4는 BMP 이외의 보조 문자를 나타내는 데 사용할 수 있습니다. UCS-2에서 2바이트마다 0x0000을 추가하면 BMP 문자가 UCS-4로 인코딩됩니다. UCS-4에서 UTF-8로의 변환 관계도 있습니다. 이 변환 관계에 따르면 UTF-8은 UCS-4를 인코딩하는 데 최대 6바이트를 사용할 수 있습니다.

UTF-8의 생성 규칙과 UCS 문자 집합의 특성에 따르면 UTF-8의 특성을 볼 수 있습니다.

UTF-8은 ASCII와 완벽하게 호환됩니다. , 즉, ASCII 해당 문자는 UTF-8의 ASCII 인코딩과 정확히 동일합니다. 0x00-0x7F 범위 내의 문자는 ASCII 문자여야 하며 다른 문자의 일부가 될 수 없습니다. GBK와 Big5 모두에 존재하는 결함은 UTF-8에는 존재하지 않습니다.

U+007F보다 큰 UCS 문자는 UTF-8 인코딩에서 최소 2바이트입니다.

UTF-8로 인코딩된 각 문자의 첫 번째 바이트는 항상 0x00-0xFD 사이입니다(UCS-4 지원에 관계없이 첫 번째 바이트는 0x00-0xEF 사이입니다). 첫 번째 바이트를 기준으로 뒤에 오는 연속 바이트 수를 확인할 수 있습니다.

첫 번째 바이트 이외의 다른 바이트는 0x80-0xBF 사이에 있으며 0xFE와 0xFF는 UTF-8에서 사용되지 않습니다.

GBK 인코딩의 한자는 모두 U+0800 - U+FFFF 사이의 UCS-2 범위에 있으므로 GBK 인코딩의 각 한자의 UTF-8 인코딩은 3바이트입니다. 그러나 GBK에 포함된 다른 문자의 UTF-8 인코딩은 GBK의 러시아어 문자와 같이 반드시 3바이트일 필요는 없습니다.

UTF-8 인코딩 전송 과정에서 1바이트가 손실되더라도 다른 문자에 영향을 주지 않고 인코딩 규칙에 따라 손실된 위치를 쉽게 찾을 수 있다. 다른 더블바이트 인코딩에서는 바이트가 손실되면 이 바이트 뒤의 모든 문자가 영향을 받습니다. 이 시점에서 UTF-8 인코딩이 전송 인코딩으로 매우 적합하다는 것을 알 수 있습니다.

上篇: Lenovo 노트북에서 다운로드한 DingTalk에서 오디오를 여는 방법 下篇: Apple의 잠금 화면 시간 및 위치를 변경하는 방법
관련 내용