인코딩과 문자셋의 차이점은 무엇입니까?


151

텍스트 인코딩과 문자 세트가 혼란 스럽습니다. 여러 가지 이유로, 나는 다가오는 작업에서 비 유니 코드, 비 UTF8을 배워야합니다.

"ISO-2022-JP"에서와 같이 이메일 헤더에 "charset"이라는 단어가 있지만 텍스트 편집기에는 그러한 인코딩이 없습니다. (다른 텍스트 편집기를 둘러 보았습니다.)

텍스트 인코딩과 문자셋의 차이점은 무엇입니까? 유스 케이스 예제를 보여 주시면 감사하겠습니다.


답변:


144

원래:

  1. 문자 집합은 사용할 수있는 문자 집합입니다
  2. 인코딩은 이러한 문자가 메모리에 저장되는 방식입니다

42
사실이지만 실제로 사용되는 "문자 세트"는 일반적으로 문자 레퍼토리와 인코딩 체계 를 모두 나타냅니다 .
Alan Moore

@AlanMoore 사실, 사람들이 "소수"를 말하는 것과 거의 같은 방식으로 "소수 구분 기호"가있는 숫자를 말합니다. 실제로 정확하지는 않지만, 일부 사람들은 그런 식으로 사용한다는 것을 알고 있어야합니다.
bvdb

2
정확하지 않습니다. 예를 들어 유니 코드는 문자 집합을 나타내지 만 가능한 여러 인코딩 (UTF-8, UTF-16, UTF-32)이 있습니다.
rghome

84

모든 인코딩에는 이와 관련된 특정 문자 집합이 있지만 주어진 문자 집합에 대해 둘 이상의 인코딩이있을 수 있습니다. 문자 집합은 단순히 문자 집합처럼 들립니다. 특정 스크립트 나 언어를위한 문자를 포함하여 많은 문자 집합이 있습니다.

그러나 우리는 거의 모든 세계 스크립트를 표현할 수있는 문자 집합을 포함하는 유니 코드로의 전환 과정을 잘 진행하고 있습니다. 그러나 유니 코드에는 여러 가지 인코딩이 있습니다. 인코딩은 문자열을 바이트 문자열에 매핑하는 방법입니다. 유니 코드 인코딩의 예로는 UTF-8 , UTF-16 BEUTF-16 LE가 있습니다. 이들 각각은 특정 응용 프로그램 또는 기계 아키텍처에 장점이 있습니다.


20
javadoc은 InputStreamReader 와 같이 "encoding"대신 "charset"을 잘못 사용한다는 점을 참고하십시오. "InputStreamReader는 바이트 스트림에서 문자 스트림으로의 브리지입니다. 바이트를 읽고 지정된 문자 세트를 사용하여 문자로 디코딩합니다. "이름으로 지정하거나 명시 적으로 지정하거나 플랫폼의 기본 문자셋을 사용할 수 있습니다." . 그러나 그 의미는 "인코딩"입니다.
David Tonhofer

4
설명해 주셔서 감사합니다. 유니 코드 는 문자 집합이며 UTF-8유니 코드의 한 가지 인코딩 방식 이고 UTF-16유니 코드의 또 다른 인코딩 방식입니다 .
HongchaoZhang

47

다른 답변 외에도이 기사는 잘 읽은 것 같습니다. http://www.joelonsoftware.com/articles/Unicode.html

이 기사의 제목 은 Joel Spolsky가 쓴 " 유니 코드 및 문자 집합에 대해 반드시 알아야 할 절대 최소 모든 소프트웨어 개발자 "입니다 (변명 없음) . 이 수필은 10 세 이상이지만 (불행히도) 내용은 여전히 ​​유효합니다 ...


2
기사를 소개해 주셔서 감사합니다. 그것은 이다 좋은 하나.
TK.

9
이 대답은 내가 Joel의 기사를 읽어야 하는 이유에 대한 간단한 설명을 제공함으로써 개선 될 수 있습니다 .
james.garriss

@mattanja 제공하신 링크는 정말 좋습니다. 공유해 주셔서 감사합니다. 투표함.
hagrawal

1
나는 또한이 위대한 기사를 Joel Spolsky의 부록에 넣기를 원합니다. kunststube.net/encoding
mkb

나는 처음 읽을 때 Joel의 기사를 이해하지 못했습니다. 오히려이 파워 포인트가 훨씬 명확하고 구체적이라는 것을 알았습니다 : unicode.org/notes/tn23/Muller-Slides+Narr.pdf
johnsimer

27

문자 인코딩은 다음으로 구성됩니다.

  1. 지원되는 문자 세트
  2. 문자와 정수 사이의 매핑 ( "코드 포인트")
  3. 코드 포인트가 일련의 "코드 단위"로 인코딩되는 방식 (예 : UTF-16의 경우 16 비트 단위)
  4. 코드 단위가 바이트로 인코딩되는 방법 (예 : 빅 엔디안 또는 리틀 엔디안)

1 단계 자체는 "문자 레퍼토리"또는 추상 "문자 세트"이며 # 1 + # 2 = "코딩 된 문자 세트"입니다.

그러나 유니 코드가 대중화되고 동아시아 인을 제외한 모든 사람들이 단일 바이트 인코딩을 사용하기 전에는 3 단계와 4 단계가 사소한 작업이었습니다 (코드 포인트 = 코드 단위 = 바이트). 따라서 이전 프로토콜은 "문자 인코딩"과 "코드화 된 문자 세트"를 명확하게 구분하지 못했습니다. 오래된 프로토콜은 charset실제로 인코딩을 의미 할 때 사용 합니다.


html META 태그에서 charset = 'utf-8'을 읽을 수있는 이유는 무엇입니까? 그것은 오래 전에 정의 되었기 때문에
Eildosa

26

앞으로 방문하는 사람들에게 더 많은 빛을 비추는 것이 도움이 되길 바랍니다.


문자 세트

각 언어에 문자가 있으며 해당 문자의 모음은 해당 언어의 "문자 세트"를 형성합니다. 문자가 인코딩되면 고유 식별자 또는 코드 포인트라는 번호가 할당됩니다. 컴퓨터에서이 코드 포인트는 하나 이상의 바이트로 표시됩니다.

문자 집합의 예 : ASCII (모든 영어 문자 포함), ISO / IEC 646, 유니 코드 (세계 모든 살아있는 언어의 문자 포함)

코딩 된 문자 세트

코드화 된 문자 세트는 각 문자에 고유 번호가 지정된 세트입니다. 이 고유 번호를 "코드 포인트"라고합니다.
코드화 된 문자 세트를 코드 페이지라고도합니다.

부호화

인코딩은 동일한 인코딩 체계를 사용하여 다른 시스템에서 문자를 균일하게 읽고 쓸 수 있도록 코드 포인트를 일부 바이트로 매핑하는 메커니즘입니다.

인코딩 예 : ASCII, UTF-8, UTF-16, UTF-32와 같은 유니 코드 인코딩 체계

위의 3 가지 개념의 정교화

  • Devanagari 문자 세트의 문자 'क' 는 UTF-16 인코딩을 사용할 때 2 바이트 ( ) 로 표시되는 2325 의 10 진수 코드 포인트 를 갖습니다.09 15
  • "ISO-8859-1"인코딩 체계에서 "ü"(이것은 라틴 문자 집합의 문자 일 뿐임)는 16 진수 값으로 표현되는 FC반면 "UTF-8" C3 BC에서는 UTF-16으로로 표현 됩니다 FE FF 00 FC.
  • 예를 들어 "ISO-8859-1"(라틴어로도 불림)에서 문자 'é'의 십진 코드 포인트 값은 233이지만 다른 인코딩 체계는 동일한 코드 포인트를 사용하여 다른 문자를 나타낼 수 있습니다. 그러나 ISO 8859-5 동일한 코드 포인트는 키릴 문자 'щ'를 나타냅니다.
  • 반면, 유니 코드 문자 집합의 단일 코드 포인트는 실제로 문서에 사용 된 인코딩에 따라 다른 바이트 시퀀스에 매핑 될 수 있습니다. UTF-16 인코딩 ( 09 15), UTF-8 ( E0 A4 95)이있는 3 바이트 또는 UTF-32가있는 4 바이트 인 코드 포인트 2325 (16 진수 표기법에서 915)가있는 Devanagari 문자 क는 2 바이트로 표시됩니다. ( 00 00 09 15)

11

문자 집합 또는 문자 레퍼토리는 단순히 문자 집합 (정렬되지 않은 모음)입니다. 코드화 된 문자 세트는 레퍼토리의 각 문자에 정수 ( "코드 포인트")를 지정합니다. 인코딩은 코드 포인트를 바이트 스트림으로 명확하게 나타내는 방법입니다.


이것이 정답입니다. 문자 세트, 코드화 된 문자 세트 및 인코딩의 세 가지 개념을 명확하게 정의합니다.
Marcus Junius Brutus 2016 년

6

그것을 위해 구글했다. http://en.wikipedia.org/wiki/Character_encoding

그 차이는 미묘한 것 같습니다. 문자셋이라는 용어는 실제로 유니 코드에는 적용되지 않습니다. 유니 코드는 일련의 추상화를 거칩니다. 추상 문자-> 코드 포인트-> 코드 포인트를 바이트로 인코딩.

문자셋은 실제로 이것을 건너 뛰고 문자에서 바이트로 직접 점프합니다. 바이트 순서 <-> 문자 순서

간단히 말해서, 인코딩 : 코드 포인트-> 바이트 문자셋 : 문자-> 바이트


5

캐릭터 셋은 세트 일뿐입니다. 예를 들어 유로 기호를 포함하거나 그렇지 않은 경우. 그게 다야.

인코딩은 문자 집합에서 정수 집합으로의 쌍방향 매핑입니다. 유로 기호를 지원하는 경우 해당 문자에 다른 정수를 지정하지 않아야합니다.


그것은 형용사해야합니까?
Jörg W Mittag

2
인코딩과 디코딩은 결정 론적이어야하기 때문에 실제로 모호한 매핑이있을 수 없습니다. 비 연속적인 정수 세트를 코 도메인으로 가질 수 있지만 텍스트를 저장할 때 공간이 낭비되고 엔지니어는 공간 낭비를 싫어합니다.
Kilian Foth

1
레거시 문자 인코딩은 종종 형용사가 아닙니다. 예를 들어, IBM437에서 ß와 β는 모두 0xE1로 표시됩니다.
dan04

3

내 의견으로는, 문자 세트는 인코딩 (구성 요소)의 일부이며 인코딩에는 문자 세트 속성이 있으므로 문자 세트를 많은 인코딩에 사용할 수 있습니다. 예를 들어 유니 코드는 UTF-8, UTF-16 등과 같은 인코딩에 사용되는 문자 집합입니다. 여기에 그림을보십시오 :여기에 그림을 참조하십시오

문자셋의 문자는 프로그래밍 세계의 문자 유형을 의미하지 않습니다. 실제 세계의 문자를 의미합니다. 영어로 똑같을 수도 있지만 중국어와 같은 다른 언어에서는 '我'가 문자셋에서 분리 할 수없는 '문자'입니다 (UNICODE, GB [GBK 및 GB2312에서 사용]) 'a'는 문자 집합의 문자이기도합니다 (ASCII, ISO-8859 , UNICODE).


1

제 생각에는 "charset"이라는 단어는 이름으로 문자 인코딩 (일련의 텍스트 문자에서 일련의 바이트로의 매핑)을 지정하기 위해 HTTP, MIME 및 유사한 표준에서 사용되는 매개 변수를 식별하는 것으로 제한되어야합니다. 예를 들면 다음과 같습니다.charset=utf-8 ..

그러나 MySQL, Java 및 기타 장소에서는 "charset"이라는 단어를 사용하여 문자 인코딩을 의미 할 수 있습니다.


1

인코딩은 문자 집합의 바이트와 문자 사이의 매핑이므로 바이트문자 의 차이점을 논의하고 이해하는 것이 도움이됩니다. .

바이트는 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 헤더에 나타나거나 텍스트 편집기에서 지정할 수 있습니다. 바이트와 ​​문자 사이의 맵핑을 시스템에 알려줍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.