답변:
원래:
모든 인코딩에는 이와 관련된 특정 문자 집합이 있지만 주어진 문자 집합에 대해 둘 이상의 인코딩이있을 수 있습니다. 문자 집합은 단순히 문자 집합처럼 들립니다. 특정 스크립트 나 언어를위한 문자를 포함하여 많은 문자 집합이 있습니다.
그러나 우리는 거의 모든 세계 스크립트를 표현할 수있는 문자 집합을 포함하는 유니 코드로의 전환 과정을 잘 진행하고 있습니다. 그러나 유니 코드에는 여러 가지 인코딩이 있습니다. 인코딩은 문자열을 바이트 문자열에 매핑하는 방법입니다. 유니 코드 인코딩의 예로는 UTF-8 , UTF-16 BE 및 UTF-16 LE가 있습니다. 이들 각각은 특정 응용 프로그램 또는 기계 아키텍처에 장점이 있습니다.
다른 답변 외에도이 기사는 잘 읽은 것 같습니다. http://www.joelonsoftware.com/articles/Unicode.html
이 기사의 제목 은 Joel Spolsky가 쓴 " 유니 코드 및 문자 집합에 대해 반드시 알아야 할 절대 최소 모든 소프트웨어 개발자 "입니다 (변명 없음) . 이 수필은 10 세 이상이지만 (불행히도) 내용은 여전히 유효합니다 ...
문자 인코딩은 다음으로 구성됩니다.
1 단계 자체는 "문자 레퍼토리"또는 추상 "문자 세트"이며 # 1 + # 2 = "코딩 된 문자 세트"입니다.
그러나 유니 코드가 대중화되고 동아시아 인을 제외한 모든 사람들이 단일 바이트 인코딩을 사용하기 전에는 3 단계와 4 단계가 사소한 작업이었습니다 (코드 포인트 = 코드 단위 = 바이트). 따라서 이전 프로토콜은 "문자 인코딩"과 "코드화 된 문자 세트"를 명확하게 구분하지 못했습니다. 오래된 프로토콜은 charset
실제로 인코딩을 의미 할 때 사용 합니다.
앞으로 방문하는 사람들에게 더 많은 빛을 비추는 것이 도움이 되길 바랍니다.
각 언어에 문자가 있으며 해당 문자의 모음은 해당 언어의 "문자 세트"를 형성합니다. 문자가 인코딩되면 고유 식별자 또는 코드 포인트라는 번호가 할당됩니다. 컴퓨터에서이 코드 포인트는 하나 이상의 바이트로 표시됩니다.
문자 집합의 예 : ASCII (모든 영어 문자 포함), ISO / IEC 646, 유니 코드 (세계 모든 살아있는 언어의 문자 포함)
코드화 된 문자 세트는 각 문자에 고유 번호가 지정된 세트입니다. 이 고유 번호를 "코드 포인트"라고합니다.
코드화 된 문자 세트를 코드 페이지라고도합니다.
인코딩은 동일한 인코딩 체계를 사용하여 다른 시스템에서 문자를 균일하게 읽고 쓸 수 있도록 코드 포인트를 일부 바이트로 매핑하는 메커니즘입니다.
인코딩 예 : ASCII, UTF-8, UTF-16, UTF-32와 같은 유니 코드 인코딩 체계
09 15
FC
반면 "UTF-8" C3 BC
에서는 UTF-16으로로 표현 됩니다 FE FF 00 FC
.09 15
), UTF-8 ( E0 A4 95
)이있는 3 바이트 또는 UTF-32가있는 4 바이트 인 코드 포인트 2325 (16 진수 표기법에서 915)가있는 Devanagari 문자 क는 2 바이트로 표시됩니다. ( 00 00 09 15
)문자 집합 또는 문자 레퍼토리는 단순히 문자 집합 (정렬되지 않은 모음)입니다. 코드화 된 문자 세트는 레퍼토리의 각 문자에 정수 ( "코드 포인트")를 지정합니다. 인코딩은 코드 포인트를 바이트 스트림으로 명확하게 나타내는 방법입니다.
그것을 위해 구글했다. http://en.wikipedia.org/wiki/Character_encoding
그 차이는 미묘한 것 같습니다. 문자셋이라는 용어는 실제로 유니 코드에는 적용되지 않습니다. 유니 코드는 일련의 추상화를 거칩니다. 추상 문자-> 코드 포인트-> 코드 포인트를 바이트로 인코딩.
문자셋은 실제로 이것을 건너 뛰고 문자에서 바이트로 직접 점프합니다. 바이트 순서 <-> 문자 순서
간단히 말해서, 인코딩 : 코드 포인트-> 바이트 문자셋 : 문자-> 바이트
캐릭터 셋은 세트 일뿐입니다. 예를 들어 유로 기호를 포함하거나 그렇지 않은 경우. 그게 다야.
인코딩은 문자 집합에서 정수 집합으로의 쌍방향 매핑입니다. 유로 기호를 지원하는 경우 해당 문자에 다른 정수를 지정하지 않아야합니다.
내 의견으로는, 문자 세트는 인코딩 (구성 요소)의 일부이며 인코딩에는 문자 세트 속성이 있으므로 문자 세트를 많은 인코딩에 사용할 수 있습니다. 예를 들어 유니 코드는 UTF-8, UTF-16 등과 같은 인코딩에 사용되는 문자 집합입니다. 여기에 그림을보십시오 :
문자셋의 문자는 프로그래밍 세계의 문자 유형을 의미하지 않습니다. 실제 세계의 문자를 의미합니다. 영어로 똑같을 수도 있지만 중국어와 같은 다른 언어에서는 '我'가 문자셋에서 분리 할 수없는 '문자'입니다 (UNICODE, GB [GBK 및 GB2312에서 사용]) 'a'는 문자 집합의 문자이기도합니다 (ASCII, ISO-8859 , UNICODE).
인코딩은 문자 집합의 바이트와 문자 사이의 매핑이므로 바이트 와 문자 의 차이점을 논의하고 이해하는 것이 도움이됩니다. .
바이트는 0에서 255 사이의 숫자로 생각하지만 문자는 "a", "1", "$"및 "Ä"와 같은 추상적 인 것입니다. 사용 가능한 모든 문자 세트를 문자 세트 라고합니다. .
각 문자에는 해당 문자를 나타내는 데 사용되는 하나 이상의 바이트 시퀀스가 있습니다. 그러나 바이트의 정확한 수와 값은 사용 된 인코딩에 따라 다르며 많은 다른 인코딩이 있습니다.
대부분의 인코딩은 문자 당 단일 바이트 (실제로 7 비트)이며 ASCII (영어)라는 오래된 문자 세트와 인코딩을 기반으로하며 미국 영어에서 사용되는 많은 공통 문자를 포함하여 128자를 포함합니다.
예를 들어, ASCII 문자 세트에는 값 60-65로 표시되는 6 개의 문자가 있습니다.
Extract of ASCII Table 60-65
╔══════╦══════════════╗
║ Byte ║ Character ║
╠══════╬══════════════║
║ 60 ║ < ║
║ 61 ║ = ║
║ 62 ║ > ║
║ 63 ║ ? ║
║ 64 ║ @ ║
║ 65 ║ A ║
╚══════╩══════════════╝
전체 ASCII 세트에서 사용 된 가장 낮은 값은 0이고 가장 높은 값은 127입니다 (둘 다 숨겨진 제어 문자 임).
그러나 기본 ASCII가 제공하는 것보다 많은 문자 (예 : 악센트, 통화 기호, 그래픽 기호 등)가 필요하면 ASCII가 적합하지 않으며보다 광범위한 것이 필요합니다. 더 많은 문자 (다른 문자 집합)가 필요하고 128 문자로 모든 문자를 입력하기에 충분하지 않기 때문에 다른 인코딩이 필요합니다. 일부 인코딩은 1 바이트 (256 자) 또는 최대 6 바이트를 제공합니다.
시간이 지남에 따라 많은 인코딩이 만들어졌습니다. Windows 세계에는 CP1252 또는 ISO-8859-1이 있지만 Linux 사용자는 UTF-8을 선호하는 경향이 있습니다. Java는 기본적으로 UTF-16을 사용합니다.
한 인코딩에서 문자의 한 바이트 값 시퀀스는 다른 인코딩에서 완전히 다른 문자를 나타내거나 유효하지 않을 수도 있습니다.
예를 들어 ISO 8859-1 에서 â 는 1 바이트의 value로 표시되는 226
반면 UTF-8 에서는 2 바이트 195, 162
입니다. 그러나 ISO 8859-1 에서 195, 162
두 개의 문자 Ã, ¢가 됩니다.
컴퓨터는 문자에 대한 데이터를 내부적으로 저장하거나 다른 시스템으로 전송할 때 바이트를 저장하거나 보냅니다. 파일을 열거 나 메시지를받는 시스템이 바이트를 본다고 상상해보십시오 195, 162
. 이들이 어떤 캐릭터인지 어떻게 알 수 있습니까?
시스템이 해당 바이트를 실제 문자로 해석하여 표시하거나 다른 인코딩으로 변환하려면 사용 된 인코딩을 알아야합니다. 그렇기 때문에 인코딩이 XML 헤더에 나타나거나 텍스트 편집기에서 지정할 수 있습니다. 바이트와 문자 사이의 맵핑을 시스템에 알려줍니다.