문자 인코딩 | [볼륨주의] 문자 인코딩, 유니코드, Utf-8이 뭔가요? 상위 230개 베스트 답변

당신은 주제를 찾고 있습니까 “문자 인코딩 – [볼륨주의] 문자 인코딩, 유니코드, UTF-8이 뭔가요?“? 다음 카테고리의 웹사이트 ppa.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://ppa.maxfit.vn/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 얄팍한 코딩사전 이(가) 작성한 기사에는 조회수 13,606회 및 좋아요 532개 개의 좋아요가 있습니다.

문자 인코딩(영어: character encoding) 또는 텍스트 인코딩(text encoding) 또는 줄여서 인코딩은 사용자가 입력한 문자나 기호들을 컴퓨터가 이용할 수 있는 신호로 만드는 것을 말한다.

문자 인코딩 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 [볼륨주의] 문자 인코딩, 유니코드, UTF-8이 뭔가요? – 문자 인코딩 주제에 대한 세부정보를 참조하세요

#인코딩 #유니코드 #utf-8
= = =
🏠 얄코사이트: https://www.yalco.kr
🛒 개발자스티커 구매: https://smartstore.naver.com/honeykers
🎥 가장 쉬운 Git 튜토리얼: https://youtu.be/FXDjmsiv8fI
🎥 가장 쉽게 배우는 리눅스: https://youtu.be/tPWBF13JIVk
🎥 포인터 쉽게 알아보기: https://youtu.be/u65F4ECaKaY
🎥 객체지향에 대해 알아보기: https://youtu.be/vrhIxBWSJ04
🎥 객체지향 디자인 패턴: https://youtu.be/lJES5TQTTWE
🎥 함수형 프로그래밍이란?: https://youtu.be/jVG5jvOzu9Y
🎥 쿠키 vs 세션 vs 캐시: https://youtu.be/OpoVuwxGRDI
🎥 프로세스와 스레드: https://youtu.be/iks_Xb9DtTM
🎥 비동기 프로그래밍: https://youtu.be/m0icCqHY39U
🎥 REST API 알아보기: https://youtu.be/iOueE9AXDQQ
🎥 GraphQL 알아보기: https://youtu.be/EkWI6Ru8lFQ
🎵 엔딩송 : 권민호, 김한영 – Let’s Dance
🎼 자료출처 : https://gongu.copyright.or.kr
🎼 Music promoted by DayDreamSound : https://youtu.be/L16GOic2UXw

문자 인코딩 주제에 대한 자세한 내용은 여기를 참조하세요.

[인코딩] 문자 인코딩이란? (Character Encoding) – 공빵탈출

문자 인코딩 (Character Encoding) … 사용자가 입력한 문자나 기호들을 컴퓨터가 이용할 수 있는 신호로 만드는 것. 컴퓨터는 모든 정보를 0과 1인 …

+ 여기에 보기

Source: limvo.tistory.com

Date Published: 10/5/2021

View: 1648

문자 인코딩

문자 인코딩은 사람이 사용하는 문자를 컴퓨터에 표현하기 위해 약속된 규칙에 따라 변환하는 과정을 말한다. 초창기 컴퓨터에서는 0과 1, 즉 기계어만을 사용하였으니 …

+ 더 읽기

Source: medium.com

Date Published: 2/14/2022

View: 2404

인코딩 – 나무위키

참고로, 컴퓨터에서 인코딩은 동영상이나 문자 인코딩 뿐 아니라 사람이 인지할 수 있는 형태의 데이터를 약속된 규칙에 의해 컴퓨터가 사용하는 0과 …

+ 자세한 내용은 여기를 클릭하십시오

Source: namu.wiki

Date Published: 6/14/2021

View: 6742

문자 집합(Character Set)과 인코딩(Encoding) – 널리

영문 문자 인코딩. 영문 알파벳 26자와 숫자, 기호, 특수문자등 128자를 7비트의 이진수로 부호화한 ASCII(American Standard Code for Information …

+ 더 읽기

Source: nuli.navercorp.com

Date Published: 6/25/2022

View: 171

문자 인코딩에 대해서 알아보자 – 1편 문자 인코딩 개념(수정)

문자 인코딩 테이블은 0부터 255까지의 정수를 표현하는 ‘단일 옥텟’이라고 불리는 일련의 비트들이 특정한 문자와 결합하여 도표화(mapping)한 것이다.

+ 자세한 내용은 여기를 클릭하십시오

Source: giraffeb.tistory.com

Date Published: 10/24/2022

View: 1036

문자 인코딩이란?

어쨌든 문자 인코딩은 문자 코드표를 어떤 방식으로 변환하는 읽고 쓰는 것에 대한 방법이다. 그럼 왜 동일한 문자 코드표에 대해 표현 방식이 다를까? 예 …

+ 여기에 보기

Source: vigli.tistory.com

Date Published: 3/7/2022

View: 1476

문자열 인코딩 완벽 정복하기(for 개발자) – 붉은섬

프로그래머가 만든 프로그램들간에는 햇님 표준 인코딩 방식이 적극적으로 사용되었고 13442를 컴퓨터에 표시해야 하는 시점에 햇님 표준전산 문자집합인 …

+ 여기를 클릭

Source: redisle.tistory.com

Date Published: 10/1/2021

View: 1381

유니코드 문자 인코딩 – IBM

유니코드 문자 인코딩 표준은 사용 중인 거의 모든 세계 언어의 문자를 포함하는 고정 길이의 문자 인코딩 체계입니다.

+ 자세한 내용은 여기를 클릭하십시오

Source: www.ibm.com

Date Published: 10/24/2021

View: 9184

[Web] 비트와 바이트, 문자 인코딩이란? – Plus Ultra

Text Encoding. 예전에는 각 나라별로, 언어마다 다양한 텍스트 인코딩이 존재했습니다. 그러다 보니 자국 언어에 맞는 인코딩 방식을 택하다 보니, 다른 …

+ 여기에 표시

Source: overcome-the-limits.tistory.com

Date Published: 1/15/2021

View: 3020

주제와 관련된 이미지 문자 인코딩

주제와 관련된 더 많은 사진을 참조하십시오 [볼륨주의] 문자 인코딩, 유니코드, UTF-8이 뭔가요?. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

[볼륨주의] 문자 인코딩, 유니코드, UTF-8이 뭔가요?
[볼륨주의] 문자 인코딩, 유니코드, UTF-8이 뭔가요?

주제에 대한 기사 평가 문자 인코딩

  • Author: 얄팍한 코딩사전
  • Views: 조회수 13,606회
  • Likes: 좋아요 532개
  • Date Published: 2021. 9. 16.
  • Video Url link: https://www.youtube.com/watch?v=1jo6q4dihoU

위키백과, 우리 모두의 백과사전

두벌식 한글 자판.

문자 인코딩(영어: character encoding) 또는 텍스트 인코딩(text encoding)[1] 또는 줄여서 인코딩은 사용자가 입력한 문자나 기호들을 컴퓨터가 이용할 수 있는 신호로 만드는 것을 말한다. 넓은 의미의 컴퓨터는 이러한 신호를 입력받고 처리하는 기계를 뜻하며, 신호 처리 시스템을 통해 이렇게 처리된 정보를 사용자가 이해할 수 있게 된다.[2] 이 신호를 입력하는 인코딩과 문자를 해독하는 디코딩을 하기 위해선 미리 정해진 기준을 바탕으로 입력과 해독이 처리되어야 하는데, 이를 문자열 세트 또는 문자셋이라고 한다. 초기 보급형 컴퓨터의 문자열 세트는 아스키나 EBCDIC이 표준이었으나, 이러한 문자열 세트는 세계 곳곳에 인터넷이 보급되며 표현해야 할 문자가 증가하면서 이러한 문자셋들을 표준화하기 위해 많은 대체 방식이 개발되었다. 표준 문자셋을 개발하는 것에 대한 논의가 이어졌고, 후에는 유니코드가 등장하게 되었다.[3]

문자열 세트의 종류 [ 편집 ]

문자 인코딩의 구성 [ 편집 ]

문자 정보는 정보를 표현하기 위한 글자들의 집합을 정의한 것으로, 직접적으로 사용되지 않을 수도 있고 한 문자 집합을 여러 문자 인코딩에서 쓸 수도 있다. 특히 집합 안의 문자들에 음수가 아닌 정수들을 배정한 것을 부호화된 문자 집합(coded character set, CCS)라 한다. 문자 집합은 ASCII와 같이 더 이상의 문자가 추가될 수 없기도 하고, 유니코드와 같이 문자가 계속 추가될 수 있기도 하다.

일반적으로 문자 집합과 문자 인코딩은 어떤 문자를 사용할 수 있으며 어떤 식으로 표현되는지를 나타낸다는 데서 동의어로 취급되기도 한다. 역사적인 이유로 MIME이나 그에 기반한 시스템은 문자 집합(“charset”)을 문자 인코딩을 나타내는 데 사용한다.

문자 인코딩 형태(character encoding form, CEF)는 특정한 문자 집합 안의 문자들을 컴퓨터 시스템에서 사용할 목적으로 일정한 범위 안의 정수(코드값)들로 변환하는 방법이다. 여기에는 유니코드 코드 포인트를 8비트 숫자의 집합으로 나타내는 UTF-8이나, 16비트 숫자의 집합으로 나타내는 UTF-16, 그리고 대부분의 일반적인 문자 인코딩들이 포함된다.

문자 인코딩 구조(character encoding scheme, CES)는 문자 인코딩 형태로 변환된 코드값을 옥텟 기반의 시스템에서 사용하기 위하여 옥텟들로 변환하는 방법이다. 대부분의 문자 인코딩 형태는 이 과정에서 아무런 일도 일어 나지 않으며, 8비트 이상의 숫자를 사용하는 UTF-16과 같은 문자 인코딩 형태의 경우 엔디안을 지정해 주는 것으로 충분하다. 여기에는 ISO 2022와 같은 복합 인코딩이나, SCSU와 같은 압축 방법 등이 속한다.

퍼센트 인코딩 [ 편집 ]

이 부분의 본문은 이 부분의 본문은 퍼센트 인코딩 입니다.

퍼센트 인코딩(percent-encoding)은 URL에 문자를 표현하는 문자 인코딩 방법이다. 이 방법에 따르면 알파벳이나 숫자 등 몇몇 문자를 제외한 값은 옥텟 단위로 묶어서, 16진수 값으로 인코딩한다.

문자깨짐 현상 [ 편집 ]

이 부분의 본문은 이 부분의 본문은 문자깨짐 입니다.

utf-8이나 euc-kr같은 서로 다른 문자 인코딩 방식은 텍스트나 문자의 깨짐 현상을 일으키는 주요 원인중 하나이다.

같이 보기 [ 편집 ]

각주 [ 편집 ]

[인코딩] 문자 인코딩이란? (Character Encoding)

문자 인코딩 (Character Encoding)

사용자가 입력한 문자나 기호들을 컴퓨터가 이용할 수 있는 신호로 만드는 것.

컴퓨터는 모든 정보를 0과 1인 바이너리, 즉 숫자로 저장한다.

그러나 우리는 문서작업, 코딩, 메시지 등 컴퓨터에서 문자를 사용하여 입력하고 저장하며 처리하고 있다.

우리가 메모장에 한글로 문자열을 입력하여 저장하게 되면 컴퓨터가 한글을 어떻게 이해할 수 있을까?

입력된 한글을 컴퓨터가 이해할 수 있는 신호로 변환하는 과정이 일어났기 때문이다.

여기서 컴퓨터가 이해할 수 있는 신호란 앞서 말한 바이너리 데이터를 의미한다.

역으로, 디코딩이란 0과 1로 구성된 바이너리 데이터를 다시 문자로 복구하는 것이다.

문자 셋 (Character Set) = 코드표

바이너리 데이터로 변환하는 인코딩과 다시 문자로 변환하는 디코딩은 미리 정해진 규칙에 의해서 수행된다.

이렇게 미리 정해진 규칙을 문자 셋이라고 하며, 초기 표준 문자열 셋은 ASCII, EBCDIC … 이었다.

그러나 인터넷이 전세계적으로 보급되며 표현해야 할 문자가 증가하면서 문자 셋들을 표준화 할 필요성이 대두되었다.

이후 등장하게 된 것이 유니코드이다.

문자 인코딩과 문자 셋

문자 인코딩과 문자 셋은 약간 다른 개념이다.

문자 인코딩 : 문자를 컴퓨터가 이해할 수 있는 신호로 만드는 것

문자 셋 : 인코딩과 디코딩을 위해 미리 정해진 규칙

문자 인코딩이란, 컴퓨터가 이해할 수 있는 바이너리로 어떤 방법을 사용해도 상관없는 방법론이고

문자 셋이란, 문자를 숫자로 매핑해주는 표이다.

예를 들어, base64 인코딩은 문자열을 아스키코드로 인코딩한 후 다시 base64 코드표를 통해 인코딩을 수행한다.

이미 컴퓨터가 이해할 수 있는 아스키 코드로 인코딩된 문자열을 새로운 base64 코드표로 인코딩한다는 것이다.

위의 예시와 같이 인코딩이란 바이너리를 생성하기 위한 과정이라고 볼 수 있다.

또한 아스키 인코딩과 같이 문자 셋과 문자 인코딩이 동일한 경우도 있기 때문에

인코딩이 문자 셋을 포함하고 있다고 생각할 수 있다.

ASCII (American Standard Code for Information Interchange, 미국 정보 교환 표준 부호)

아스키 코드는 문자 그대로 미국에서 정의하고 있는 표준, 영문 알파벳을 사용하는 대표적인 문자 인코딩이다.

초창기 컴퓨터를 기계어만을 사용하여 개발하는것에 어려움이 있어 문자를 코드화하기 위해

아스키 코드가 탄생하게 되었고 대부분의 인코딩이 아스키에 기초하고 있다.

아스키는 7bit 인코딩으로 총 1byte(8bit)에서 7bit를 사용하여 128개의 문자를 표현할 수 있다. (0 ~ 127)

나머지 1bit는 에러 검출을 위한 Parity bit로 비워두어 총 1byte로 문자를 표현한다.

* 7개의 비트 중 1의 개수가 홀수면 1, 짝수면 0으로 설정된 Parity bit를 함께 전송함.

확장아스키코드(Extended ASCII) = ANSI 코드

앞서 말했듯이 컴퓨터와 인터넷이 전세계적으로 보급되며 영어권이 아닌 나라에서도 문자열 셋을 사용해야 했다.

그래서 기존 아스키 코드의 7bit가 아닌 8bit를 문자를 표현하는데 사용하여 총 256개의 문자를 표현할 수 있게 되었다. (128 ~ 255)

아래 사진은 메모장을 통해 알파벳과 한글 문자열들을 저장한 것이다.

HxD라는 프로그램을 통해 위의 TXT 파일이 어떻게 저장되는지 확인할 수 있다.

HxD : 바이너리 파일을 읽을 수 있는 무료 에디터 프로그램

아래 그림은 메모장에 저장된 문자열을 ANSI로 디코딩한 모습을 보여준다.

HxD를 통해 나온 결과물을 한번 살펴보자!

아스키코드표를 통해 A라는 심벌은 41이라는 HEX 값을 가짐을 확인할 수 있다.

여기서 HEX는 16진수로 결국 (4 X 16) + (1 X 1) = 65의 DEC(10진수)를 나타내는 것이다.

4bit의 값이 16개의 숫자를 나타낼 수 있기 때문에 HEX 값 하나는 4bit임을 알 수 있다.

위에서 살펴보았듯이 아스키코드는 총 8bit로 이루어져 있기 때문에 HxD에서 한칸이 아스키코드임을 알 수 있다.

결과적으로 우리가 입력한 A라는 문자열은 DEC로 65, HEX로 41이라는 숫자로 표현하기로 약속한 것이고,

컴퓨터에서는 BIN인 01000001로 저장된다는 것을 알 수 있다.

아스키코드표 : https://www.ascii-code.com/

멀티바이트 인코딩(Multibyte Encoding)

처음 멀티바이트 인코딩이 사용된 것은 CJK(Chinese-Japanese-Korean) 멀티바이트 인코딩으로

한국어, 중국어, 일본어는 문자의 수가 매우 많기 때문에 확장아스키코드 영역의 128개로도 부족했기 때문이었다.

따라서 1byte가 아닌 여러 byte를 통해 문자를 표현한 것이 멀티바이트 인코딩이다.

한국의 인코딩 방식은 여러 인코딩 방식을 거쳐왔다.

한글의 자음과 모음을 조합해서 표현할 수 있는 조합형 한글 인코딩

자음과 모음을 합쳐서 완성된 문자로 표현하는 완성형 한글 인코딩

완성형 인코딩에서는 EUC-KR : 2350자 / CP949(MS949) : 11172자 를 사용하게 되었고,

조합형 인코딩에서는 2byte 조합, 3byte 조합, N byte 조합과 같은 여러 방식을 사용하게 되었다.

많은 인코딩 방식을 사용하면서 서로 다른 인코딩 방식을 사용한 프로그램이나 문서 사이에서는 정상적으로 디코딩되지 않는 호환성 문제가 발생할 수 밖에 없었다는 것을 알 수 있다.

유니코드 (UNICODE)

멀티바이트 인코딩의 문제는 한국에 국한되는 문제가 아니었다.

한글뿐만 아니라 중국어, 일본어도 마찬가지로 각자의 언어를 표현할 수 있는 인코딩 방식과 다른 문자열 셋을 사용하기 때문에 모든 언어를 동시에 표현할 수는 없었다.

결국 전세계의 모든 문자를 하나의 문자 셋으로 표현할 수 없을까?라는 문제가 등장하게 된 것이다.

이러한 문제를 해결하기 위해 전세계적으로 사용되는 모든 문자 집합을 하나로 모아 탄생시킨 것이 유니코드이다.

유니코드의 목적은 현존하는 문자 인코딩 방법들을 모두 유니코드로 교체하려는 것이다.

유니코드는 존재하는 모든 문자들을 2byte(16bit)로 표현하려고 했으며, 이론적으로 65536개의 문자를 표현할 수 있다.

그러나 한글의 조합과 수 많은 한자들, 그리고 히라가나등, 중앙 아시아의 문자들을 2byte에는 모두 담지 못했다.

그래서 유니코드에서는 2byte를 가지는 평면을 여러개 만들어 이를 해결하고자 하였다.

평면을 나누기 위해 추가적으로 1byte를 사용할 수 있기 때문에 총 2~3byte를 통해 유니코드를 표현할 수 있다.

유니코드를 나타내는 U+와 16진수를 합쳐 U+0000에서 U+FFFF 까지 문자를 표현할 수 있으며,

앞에 평면을 위한 1byte인 U+00에서 U+FF를 추가할 수 있다. (총 256개의 평면 가능)

[예시] 1번 평면 U+01XXXX, 2번 평면 U+02XXXX 등

[0번] 유니코드 기본평면 (BMP : Basic Multilingual Plane)

앞서 말한 17개의 평면 중에 0번 평면이다.

기본평면에는 거의 모든 근대 문자와 특수 문자가 포함되어 있으며 한중일이 거의 대부분의 영역을 차지함을 확인할 수 있다.

기본 평면은 총 2byte로 U+0000 에서 U+FFFF로 표시한다.

[출처] 위키피디아/유니코드평면

[1 ~ 16번] 평면

1번 평면 : 보조 다국적 평면 / 옛 문자, 음악 기호, 수학 기호를 표현

2번 평면 : 보조 상형 문자 평면 / 초기 유니코드에 포함되지 않은 한중일 통합 한자를 주로 담고 있음

3번 평면 : 3차 상형문자 평면 / 갑골 문자, 금문 등의 문자와 한중일 통합 한자, 기타 옛 상형 문자를 위해 예약된 영역

4번 ~ 13번 : 미지정 평면

14번 평면 : 보조 특수 목적 평면 / 소수의 제어용 문자

15 ~ 16번 : 사용자 영역 / 특정 업체나 사용자 별로 할당하여 씀

한글 유니코드 : http://www.unicode.org/charts/PDF/UAC00.pdf

유니코드 : https://home.unicode.org/basic-info/overview/

문자 집합(Character Set)과 인코딩(Encoding)

안녕하세요. 이건준입니다.

간혹, 개발자들로부터 한글이 깨진다는 문의를 받을 때가 있습니다.

인터넷에 검색을 해보면 캐릭터셋을 바꾸거나 제대로 된 인코딩으로 파일을 새로 저장하라는 등의 답변을 얻을 수 있는데, 여기서 나오는 캐릭터셋, 인코딩이라는 용어를 우리는 자주 들어왔지만 정확히 어떤 것인지, 어떤 관계가 있는지, utf-8과 euc-kr이 어떻게 다른 것인지 잘 알지 못했습니다.

euc-kr로 작업한 파일이 MS949에서 깨진다는 문의를 받으면 당황하지 않고 친절히 설명할 수 있도록, 이제 캐릭터셋과 인코딩의 정확한 의미와 여러 인코딩의 종류를 알아볼 차례입니다.

정의

문자 집합은 정보를 표현하기 위한 글자나 기호들의 집합을 정의한 것입니다.

이런 문자나 기호의 집합을 컴퓨터에서 저장하거나 통신에 사용할 목적으로 부호화 하는 것을 문자 인코딩(부호화)이라 하고 인코딩 된 문자 부호(Character code)를 다시 디코딩(복호화)하여 본래 문자나 기호로 표현할 수 있습니다.

그림 1. 대표적인 문자 부호는 모스 부호가 있다

영문 문자 인코딩

영문 알파벳 26자와 숫자, 기호, 특수문자등 128자를 7비트의 이진수로 부호화한 ASCII(American Standard Code for Information Interchange) 부호가 현재도 널리 사용되고 있으며, 실질적인 영문자의 국제 표준 부호입니다.

그림 2. 128개의 ASCII 부호

한글 문자 인코딩

컴퓨터가 한글을 표현하기 시작하던 1980년대에는 2바이트 조합형 한글을 주로 사용하였습니다. 조합형 한글의 원리는 초, 중, 종성에 해당하는 문자를 각각 부호화하여 문자에 따라 부호를 조합하여 만드는 방식입니다.

그러나 초, 중, 종성을 조합하는 부호표가 각 업체마다 달라서 A사의 컴퓨터에서 작성한 프로그램이 B사의 컴퓨터에서는 한글이 깨지는 문제가 발생하게 됩니다.

정부는 한글 전자 문자 표준의 제정의 필요성을 느끼고 표준을 제정하게 되는데, 당시 학계에서는 조합형 한글이 한글 창제의 원리에 부합하고 모든 활자를 표현 가능하므로 조합형을 표준으로 제안하였으나 정부는 완성형 한글을 표준(KS_C_5601_1987)으로 제정합니다.

그림 3. 한글 문자집합은 총 11172자이다

완성형(KSC5601-87)의 표준 채택 이유

ISO-2022(2바이트 이상의 문자 부호를 사용할 때 지켜야 하는 확장 방법에 관한 국제 표준)에 따르고 있으므로 외국의 네트워크나 SW 사용에 유리하다.

현재의 한글 사용 실태를 조사해 보았을 때 2,350자의 한글만으로도 충분히 모든 표현이 가능하다.

정렬 작업에 있어서 한글 변환 테이블을 통해서 가능함으로 크게 문제가 될 것이 없다.

완성형(KSC5601-87)에 대한 반론

한글 창제의 원리 초, 중, 종성의 구별이 없는 단순한 부호에 불과하다.

모든 한글을 표기 할 수 없으므로 문학 작품을 집필하거나 신조어를 표현할 때 문제가 된다.

우리 언어의 영역이 제한 받는 결과를 가져온다.

한글이라 붙여진 코드에 한글보다 한자가 더욱 많다. 또한 필요 없는 특수 문자가 너무 많고 외국의 문자집합까지 포함하고 있어 오히려 한글 사용 영역이 줄어들었다.

음소의 분석이 어려우므로 형태소 해석이 불가능하여, 차후 음성 인식에서 사용할 수 없는 부호이다.

ISO-2022를 따르고 있다고 하지만 ISO의 인증은 받지 못한 부호이다.

한글 오토마타(automata) 구현에 있어서 한글 키 입력에 의해 조합형 코드가 만들어지면 이를 테이블을 통해 완성형 코드로 변환하여 호출하므로 부담이 된다.

KSC5601이 표준으로 제정되자 기업들은 앞다투어 완성형 한글만을 탑재하기 시작했으나 이로 인해 워드프로세서에서 한글 표기가 제대로 되지 않는 문제(고어나 독음)가 발생하여 워드프로세스의 내부에서 코드를 조합하여 표현이 가능하도록 하는 등의 기형적인 구현사례가 늘어나게 됩니다.

이후 KSC5601-87에 1930자의 한글을 추가한 KSC5657을 발표하였으나 여전히 근본적인 문제가 해결되지 않은 부호로 거의 사용되지 않았고, 결국, 정부는 1992년 기존 KSC5601 완성형과 함께 조합형 한글을 함께 수용할 수 있는 KSC5601-92를 표준으로 제정하여 현재까지 사용하고 있습니다.

그림4. 2바이트 조합형 한글 부호표 (KSC5601-92)

유니코드(Unicode) 프로젝트

유니코드는 전세계의 모든 문자를 동일하게 표현하기 위한 산업표준으로 유니코드협회(Unicode Consortium)가 제정하며, 유니코드에는 ISO-10646에 포함된 문자집합, 문자 부호화와 문자를 표시하기 위한 복호화 알고리즘이 포함되어 있습니다.

ISO-10646은 문자 표시에 관한 국제 표준으로 초기 ISO-10646과 유니코드는 서로 다른 독자적인 표준이었으나. ISO-10646-1이 제정되면서, ISO실행위원회와 유니코드컨소시엄의 협의로 문자 표시 방법이 통합되어 현재의 국제 표준은 유니코드라고 할 수 있습니다.

(ISO-10646에는 KS X 1001(KSC5601), EUC-KR, ISO-2022-KR의 한글 문자 부호가 포함되어 있다.)

UTF (Unicode Transformation Format)

UTF는 유니코드 형태의 문자를 변환하기 위한 공식이다. 유니코드는 4byte 구성되어 있기 때문에 사용하는 코드 범위에 따라서 1~4byte로 변환이 가능하게 된다. UTF-7, UTF-8, UTF-16BE, UTF-16LE등의 종류가 있다.

EUC

euc는 extend unix code의 약자로 유닉스에서 영어를 제외한 문자를 표시하기 위한 확장 부호를 의미합니다. 그 중 euc-kr은 한글 표현을 위한 문자 인코딩인데, 영문은 KSC5636(ASCII와 동일하나 역슬래쉬를 원표시로 대체)으로 처리하고 한글은 KSC5601로 처리합니다. 과거 euc-kr은 KSC5601-87의 완성형 한글이었으나 현재의 euc-kr은 KSC5601-92로 조합형 한글까지 사용 가능합니다.

CP949

마이크로소프트에서 사용하는 한글 문자의 부호표입니다. 본래 code page는 IBM에서 최초 고안하였으나 MS-window에서 한글 표현을 위해 채용하면서 MS949로 불리우기도 합니다. 처음 CP949는 KSC5601에 표현된 2350자만을 제공하였으나 KSC5601-92가 제정되면서 조합형 한글에 대한 부호표도 추가되어 제공되고 있습니다.

KSC5601 vs EUC-KR vs CP949

KSC5601은 완성형과 조합형의 모든 한글 문자의 표현이 가능한 한글 문자 부호 표준이며 euc-kr과 CP949는 모두 이 KSC5601을 기본으로 한 문자 부호입니다. 유닉스계열의 한글 문자 부호인 euc-kr에서는 KSC5601을 그대로 수용하고 있으며, 윈도우계열 한글 문자 부호인 CP949(MS949)는 완성형 한글의 형태를 취하고 있으나 KSC5601에 의해 조합형으로 만들어지는 한글의 코드까지도 제공하고 있으므로 두 문자 부호의 인코딩 방식은 달라도 같은 코드를 만들어 내게 되어 두 문자 부호는 서로 호환됩니다. 단, java환경에서는 euc-kr이 KSC5601-87로 사용되어 CP949의 확장 완성형과 호환되지 않을 수도 있으니 주의해야 합니다.

KSC5601 vs Unicode

유니코드에는 KSC5601의 문자 집합이 포함되어 있지만, 4byte의 유니코드의 어느 범주에 속하느냐에 따라 그리고 어떤 변환식을 사용하느냐에 따라 부호의 값이 달라지므로 KSC5601을 그대로 사용하는 euc-kr(CP949)와 유니코드는 서로 호환되지 않습니다.

결론

현재의 한글 표준 부호는 완성형과 조합형의 구분이 없습니다, euc-kr로 선언된 웹페이지에서든, MS949를 사용하는 윈도우에서든 똠, 꿿, 휗 휅 같은 문자들이 모두 표시가 되기 때문에 한글을 더 쉽게 사용할 수 있어, 국제표준인 유니코드와 유닉스계열의 euc-kr만 잘 구분하여 사용할 수 있으면 인코딩 때문에 한글이 깨지는 일은 없을 것 입니다.

문자 인코딩에 대해서 알아보자 – 1편 문자 인코딩 개념(수정)

# 문자 인코딩(character encoding)

문자 인코딩은 크게 이렇게 3가지로 구성된다.

## 1. 문자 집합 또는 문자셋(chracter set, charset)

표현하고자 하는 언어의 문자들을 코드화 해놓은 것으로 볼 수 있다.

“이런 언어의 문자들을 포함하고 있으며, 해당 문자들에 코드값을 부여했다” 고 보면 된다.

한글을 예로들면,

euc-kr에서 사용된 문자집합이 몇몇 한글을 지원하지 않았고, 해당 문자 인코딩으로 이루어진 시스템에서 사용자가 본인의 이름을 사용하지 못했다는 기사를 본적이 있다.

아래 표와 같이 표현된다. 유니코드를 나타내는 U+ AC00은 “가”를 나타낸다.

## 2. 문자 인코딩 형태(character encoding form, CEF) 컴퓨터 상에서 실제로 저장되는 코드값으로 볼 수 있다. 유니코드를 예를 들면 우리가 자주 접할 수 있는 UTF-8가 있다. 헷갈렸던 부분은 위의 유니코드 값을 컴퓨터에서 문자를 저장할 때 쓰지않고 변환해서 사용한다는 점이다.

UTF-8을 예로 들면 기존 문자 인코딩에 크게 문제가 없었기에 ASCII등의 레거시 시스템등의 호환성을 위해서 고안되었다. 유니코드 계열에서도 “문자 인코딩 형태”는 여러개 존재하고 각각 특정 목적이나 제안을 달성하기 위해서 만들어졌다고 보면 될 것 같다.

UTF-8의 경우 기존 알파벳은 1바이트로 그대로 표현이 가능하기 때문에 2바이트로 표현하고자 했던 다른 문자 인코딩에 비해서 호환성과 용량에서 장점이 있다.

##3. 문자 인코딩 구조(character encoding scheme, CES)

문자 인코딩 형태로 변환된 코드 값을 옥텟 기반의 시스템에서 사용하기 위하여 옥텟들로 변환하는 방법이다.

” 대부분의 문자 인코딩 형태는 이 과정에서 아무런 일도 일어나지 않으며 ” – 이유는 대부분의 시스템이 이미 8비트 단위 = 옥텟 = 바이트 형태로 구조화 되어 있기 때문인 것 같다. – , 8비트 이상의 숫자를 사용하는 UTF-16과 같은 문자 인코딩 형태의 경우 엔디안을 지정해 주는 것으로 충분하다. 즉, 어차피 바이트 단위로 작성되어 있으니, 바이트를 읽는 순서만 알려주면 된다.

여기에는 ISO 2022와 같은 복합 인코딩이나, SCSU와 같은 압축 방법 등이 속한다.

Q. 인코딩후 나온 최종 결과물을 의미하는가?

그렇다. 어차피 옥텟 = 바이트 단위로 되어있다.

+같이 읽기

옥텟(octet) 은 컴퓨팅에서 8개의 비트가 한데 모인 것을 말한다. 초기 컴퓨터들은 1바이트가 꼭 8비트만을 의미 하지 않았으므로, 8비트를 명확하게 정의하기 위해 옥텟이라는 용어가 필요 했던 것이다. 그러나 요즘에는 바이트하고 같은 의미가 되었다.

워드(word) 는 하나의 기계어 명령어나 연산을 통해 저장된 장치로부터 레지스터에 옮겨 놓을 수 있는 데이터 단위이다. 메모리에서 레지스터로 데이터를 옮기거나 할 때, 하나의 명령어로 실행될 수 있는 데이터 처리 단위이다. 흔히 사용하는 32비트 CPU(ARM등)라면 워드는 32비트가 된다.

##4. 문자 인코딩 관련 용어들

코드 페이지(code page)

– 특정한 문자 인코딩 테이블을 위해 쓰이는 전통적인 IBM용어이다. 문자 인코딩 테이블은 0부터 255까지의 정수를 표현하는 ‘단일 옥텟’이라고 불리는 일련의 비트들이 특정한 문자와 결합하여 도표화(mapping)한 것이다.

IBM과 마이크로 소프트는 코드 페이지를 문자열 집합에 자주 할당한다.

위의 분류로 보면 CEF(character encodig form)에 해당하겠다.

SCSU(Standard Compression Scheme for Unicode)

– CES에 해당한다는데 작동 개념은 아직 모르겠다.

다음에는 코딩하면서 자주 만나는 인코딩들(cp949, utf-8, utf-16)들을 위의 관점에서 나눠서 보자.

참조:

https://www.slideshare.net/dahlmoon/string-20160310 파이썬 문자 인코딩

https://ko.wikipedia.org/wiki/%EB%AC%B8%EC%9E%90_%EC%9D%B8%EC%BD%94%EB%94%A9 위키피디아 문자인코딩

https://ko.wikipedia.org/wiki/%EC%BD%94%EB%93%9C_%ED%8E%98%EC%9D%B4%EC%A7%80 위키피디아 코드페이지

https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C 위키피디아 유니코드

http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP949.TXT cp949 유니코드 맵핑

http://dev.epiloum.net/164 ASCII http://dev.epiloum.net/195 EUC-KR http://dev.epiloum.net/293 CP949 http://dev.epiloum.net/231 유니코드 http://dev.epiloum.net/445 UCS-2와 html number entity number http://dev.epiloum.net/487 utf-32 UCS4 http://dev.epiloum.net/595 utf-16 http://dev.epiloum.net/648 utf-8

http://ssaemo.tistory.com/28 인코딩들 개념 정리

http://umbum.tistory.com/328 인코딩들 개념 정리

http://studyforus.tistory.com/167 인코딩간 관계

http://d2.naver.com/helloworld/19187 네이버 기술 블로그 – 한글 인코딩 1편

http://d2.naver.com/helloworld/76650 네이버 기술 블로그 – 한글 인코딩 2편

문자 인코딩이란?

글 내용이 많지만 문자 인코딩이 궁금하다면 꼭 읽기 바란다.

우선 인코딩을 위키 백과에 나온 설명으로 보면 ‘정보의 형태나 형식을 변환하는 처리나 처리 방식이다.’ 라고 정의 되어 있다.

(출처 : https://ko.wikipedia.org/wiki/%EC%9D%B8%EC%BD%94%EB%94%A9)

즉, 어떤 정보를 미리 약속한 규칙으로 가공한다고 보면 된다.

인코딩은 문자, 동영상, 사진 등 다양하게 분야에서 많이 사용 되고 있다.

많은 인코딩 중 문자 인코딩에 대해 말하려고 한다.

먼저, 우리가 쉽게 접할 수 있는 문제로 보겠다.

문자 인코딩으로 인한 피해 사례

인터넷에 좋은 자료가 있어서 첨부 파일을 다운로드 받았는데 글이 다 깨져 있는 경우

어떤 사이트에 들어갔는데 사이트의 내용 글이 깨져 있는 경우

공개된 소스 코드 파일을 다운로드 받았는데 주석 내용이 깨져 있는 경우

내가 전달한 파일이 다른 사람에게는 그 파일 내용이 제대로 보이지 않을 때

위와 같이 문자가 깨져서 알아볼 수 없는 상황은 모두가 아마도 한번씩은 겪어 봤을 것이다.

원인이 뭘까?

글의 제목 때문에 짐작은 하고 있으리라 본다.

문제는 문자 인코딩이 다르기 때문이다.

예를 들어 설명 하겠다. (실제 규칙이 아닙니다.)

나는 “니 내 누군지 아니?”라는 내용을 저장해서 파일로 만들었다. 그 파일은 vigli 라는 인코딩 방법으로 저장된 파일이다.

vigli의 규칙은 아래와 같다.

문자 코드표 니 0 내 1 누 2 군 3 지 4 아 5 니 6 ? 7 (공백) 8 표1. vigli 인코딩의 코드표

눈으로는 ‘니 내 누군지 아니?’ 라고 보이지만 컴퓨터에 저장된 파일은 vigli 인코딩으로 ‘08182348567’ 이렇게 저장 되어있다.

그런데 상대방은 내가 보낸 파일을 vigli의 규칙과 동일한 규칙을 가진 인코딩이 아닌 다른 인코딩 방식으로 보기 때문에 08182348567’을 파일에서 읽었을때 사람의 눈으로 표현한 문자를 ‘뛝꿮뺭뾹쭭퀽’ 와 같이 보이게한다. 그래서 내가 원하는 내용과 다르게 보이는 것이다.

문자 코드표?

먼저, 인코딩을 설명하기 전 문자 코드표부터 설명을 해야겠다. 표1. vigli 인코딩의 코드표 를 보면 카테고리를 인코딩이 아닌 코드표라고 했다. 코드표는 컴퓨터가 인식하는 문자에 각각 id를 매긴 것이라고 생각하길 바란다. vigli의 코드표로 보자면 ‘니’ 라는 문자는 0이라는 id가 매겨져 있는거고, ‘내’라는 문자의 id는 1인 것이다.

컴퓨터는 문자를 인식하기 위해 ID를 매겨 코드표로 만들었고, 이것을 규칙으로 정하여 모든 나라가 동일한 코드표(표준이라 함)를 사용하게 하였다. 대표적으로는 아스키코드표와 유니코드표가 있다.

위의 자세한 설명이 있고 간단하게만 알고 싶다면 아래 설명을 읽기 바란다.

아스키 코드는 128개의 문자를 표현할 수 있다. 그러므로 영어 외에 모든 문자는 불가능 하다고 보면 된다. 그래서 모든 문자를 지원하기 위해 나온게 유니코드다. 유니코드는 아스키코드와의 호환을 위해 아스키코드의 128개의 문자 코드표는 그대로 사용한다. 때문에 지금은 유니코드를 사용한다.

그럼 문자 인코딩이 뭐지?

대표적인 문자 인코딩은 UTF-8, UTF-16, MS949, UCS-2 등이 있다. 실제 문자 인코딩은 더 많다.

어쨌든 문자 인코딩은 문자 코드표를 어떤 방식으로 변환하는 읽고 쓰는 것에 대한 방법이다.

그럼 왜 동일한 문자 코드표에 대해 표현 방식이 다를까? 예를 들어 설명한다.

컴퓨터의 저장 공간은 한정적이다. 그리고 CPU의 처리 데이터나 네트워크로 전송할 수 있는 데이터는 최대한으로 줄이는게 빠르고 좋다. 이 얘기를 왜 하느냐는 바로 지금 설명할 UTF-8, UTF-16 때문이다. 이 3가지를 설명하면 앞 선 얘기에 대해 왜 나왔는지 알 수 있을 것이다.

UTF-8

뒤에 숫자는 문자를 표현하는데 필요한 메모리 크기(bit)의 단위이다. 8이므로 8bit, 즉 1byte를 이야기 한다. 그리고 가변 길이 방식의 인코딩이다.

무슨 말이냐면 8bit, 정확히는 7bit안에 표현 가능한 문자는 하나의 문자를 표현하는데 1byte의 공간만을 차지한다. 그리고 그 범위를 벗어나는 문자는 1byte씩 더 메모리 공간을 사용한다. 그래서 어떤 문자를 표현하느냐에 따라 사용하는 공간이 다르기에 가변 길이 방식의 인코딩이라고 한다.

7bit로 표현 가능한건 1byte를 사용한다. 이 말은 아스키코드표에 속하는 문자는 모두 1byte만 사용한다는 얘기이다. 그리고 그 외의 한글 같은 문자는 더 많은 공간을 사용한다.

그럼 또 다른 의문이 생긴다. 바로 이 인코딩으로 표현된 문자가 메모리 공간을 얼마나 차지 할지에 대한 의문이다. UTF-8은 1byte를 넘는 문자에 대해 최상위 비트를 1로 표시한다. 이것을 보자면 다음과 같다.

표1. UTF 표현법 [출처 : https://ko.wikipedia.org/wiki/UTF-8 ]

표의 다른건 보지 말고 UTF-8에 해당 하는 부분만 보길 바란다. 최상위 비트가 0이면 1byte를 차지하는 문자(0xxx xxxx)인 것이고, 최상위 비트가 110이면 2bytes를 차지하는 문자(110x xxxx 10xx xxxx)인 것이다.

UTF-16

UTF-8과 다른거라고는 8이 16으로 바뀌었다는 것이다. 즉 문자를 표현하는 단위가 16bit. 즉 2bytes 공간을 차지하는 것으로 바뀐 것이다. 이것도 가변길이 방식의 인코딩이다.(문자가 정말 많아서 모든 문자를 다 표현하려면 5? 6? bytes가 필요했던 걸로 기억하는데 말 그대로 기억일뿐 정확하지 않다.)

하여튼 이 인코딩도 2bytes 로 표현 안되는 문자는 UTF-8처럼 이 문자가 2bytes 를 넘는다는 표시를 한다

표를 보면 내용중에 서러게이트(Surrogate) 라는 얘기가 있다. 이것은 무엇일까?

서러게이트는 여유 공간? 비어둔 공간? 이라고 보면 된다. 아직 맵핑하지 않은 문자에 대해 사용하기 위한 공간으로 상위 바이트 블록을 High Surrogate라 하고 하위 바이트 블록을 Low Surrogate라 한다. 그리고 둘 중 하나만 올 수 없고 꼭 쌍으로 같이 나와야한다. 표에 보면 y와 z가 해당 부분에 속한다.

그리고 표에서 설명 안한 부분인 UTF-16BE. UTF-8 은 BE가 없지만 16은 붙어있다. 이건 Big-Endian 의 약자이다. 이 부분에 대해 알고 싶다면 아래 페이지에서 보길 바란다.

BOM이란? http://vigli.tistory.com/57

UTF-8, UTF-16, 그리고 설명은 안했지만 UTF-32. 어떤걸 쓰느냐에 대한 답은 없다. 목적에 적합한 인코딩을 쓰는게 답이다.

그리고 CP949나 euc-kr도 utf 처럼 문자를 표현하는 자신만의 방법을 만든 것 뿐이다.

여하튼, 인코딩을 정리하면 이렇다.

인코딩은 어떤 문자에 대해 어떤 방식으로 표현하는지 약속인 것이다. 그래서 그 약속이 다르면 서로가 자신이 의도한 문자 표현이 안되는 것이다.

그럼 인코딩으로 알아본 피해 사례에 대한 해결 방법은?

1. 서로 인코딩을 동일하게 해서 읽고 쓴다.

2. 왠만하면, UTF-8을 기본으로 쓴다.

문자열 인코딩 완벽 정복하기(for 개발자)

문자열 인코딩!

어느날 친구가 물어봅니다. “OO아~ 문자열 인코딩이 뭐야?”

갑자기 머릿속이 하얗게 변합니다. 문자열 인코딩… 분명 들어본적은 있는데 말이죠. 기억을 마구 더듬어봅니다.

예전에 인코딩을 찾아본적이 있었지, 한글이 제대로 안나와서 찾아봤었는데, 기억의 조각들이 한두개씩 발견됩니다.

EUC-KR, MS949, 유니코드, UTF-8 등등… 한번은 들어봤을법한 단어들이 머리속을 스쳐지나갑니다.

그런데 문자열 인코딩은 유니코드인가? UTF-8인가? 헷갈리기 시작합니다. 결국….

“문자열 인코딩, 그거….. 컴퓨터에서 한글 출력할때 쓰는거 잖아,

그 뭐냐, 그 UTF-8! UTF-8 그거 쓰면돼, 여튼 막 대충하면 돼….ㅎ”

문자열 인코딩이 뭐냐면, 어…음… 그니까, 그게….음……..

분명 모르는건 아닌데 설명이 안됩니다… 누군가 물어봤을때 대충 얼버무리듯이 얼렁뚱땅 넘어간적 있지 않으셨나요?

(사실 제 이야깁니다)

주변 개발자들한테 (특히 주니어) 문자열 인코딩에 대해 물어보면 나오는 반응은 대개 아래와 같습니다.

문자열 인코딩에 대해 물어보면 나오는 다양한 반응들

프로그램을 만들다 보면 필연적으로 문자를 표시해야하는 상황을 자주 마주하게 됩니다.

어디서 들어는 봤지만 사실은 전혀 이해하지 못했던 “유니코드”, “멀티바이트”, “EUC-KR”, “CP949”, “문자열은 UTF-8이 국룰” 같은 문구가 생각나지 않으신가요?

왜 많은 사람들이 문자열 인코딩을 헷갈려할까요?

이유는 정말 간단합니다. 왜냐하면 문자열 인코딩이 정말 헷갈리기 때문입니다. ㅎㅎㅎ

알아야 할 개념들은 너무 많은데 단편적인 개념들이 조각조각 흩어져있어 이를 총망라하는 글이 없었으니까요!

하지만 너무 걱정하지마세요! 개념만 확실히 잡는다면 이해는 자연스럽게 하게 되실겁니다!

앞으로 이글을 통해 핵심과 원리를 아주 차근차근 설명해드릴테니까요!

많은 주니어 개발자들이 느끼는 문자열 인코딩

그런데 우리가 굳이 이걸 알아야 할까요?

물론 개략적으로 문자열 인코딩에 대해 알고 있다고 하더라도 컴퓨터가 문자열을 어떻게 처리하는지와 인코딩/디코딩 개념을 모호하게 잡고 간다면 개발중 어느 순간에는 반드시 헤매게 됩니다.

사실 문자열 인코딩 개념을 정확히 몰라도 개발하는데 큰 지장이 있지는 않습니다.

아래와 같은 난감한 상황을 마주치기 전까지는요.

개발자가 문자열 인코딩을 모른다면 생길 수 있는일

개념을 이해하지 못하고 사용하면 문제가 생겼을때 돌파할 수 없습니다.

그러니 앞으로 만나게 될 수도 있는 문제를 해결하기 위해 이번 시간에 공부해보자구요!

설명을 시작해볼까?

컴퓨터에서 문자를 표현해야 하는 이유?

컴퓨터는 구조적인 한계 때문에 모든 정보를 숫자로 밖에 표현할 수 없습니다.

컴퓨터가 발명되고 초창기에는 오로지 숫자를 통해서만 사람에게 정보를 전달했을겁니다.

50000,10000,5 같은 방법으로 말이죠. 이 숫자가 무슨 의미인지 파악이 되시나요?

50000,10000,5 라는 정보를 전달받은 사람은 다분히 당황했을겁니다.

저 숫자가 뭘 의미하는지 정확히 파악이 되지 않으니까요!

50000,10000,5 라는 숫자가 의미있는 정보임은 자명하지만 맥락을 파악할 수 있는 메타정보가 누락되어 있었기 때문에 정보 전달이 무척이나 어렵게 되버리고 말았습니다.

오로지 저 수치가 어떤 의미인지 메타정보를 알고 있는 사람들만 완전한 의미를 해석할 수 있을껍니다.

때문에 컴퓨터 공학자들은 고민에 빠지게 됩니다.

맥락을 담을 수 없는 숫자만으로는 사람에게 온전한 정보를 전달하기에 효율적이지 않았으니까요.

만약 “50000원을 10000원씩 나눠주면 5명에게 나눠줄 수 있습니다.” 라고 컴퓨터가 메타정보까지 함께 실어 표현할 수 있다면 온전한 의미의 정보를 전달할 수 있을겁니다.

필연적으로 숫자밖에 다룰 수 없는 컴퓨터에서 숫자 말고도 문자를 표현할 수 없을까? 하는 고민을 하게 되었지요.

다행히도 전세계 모든 언어에는 공통점이 있습니다. 세상의 모든 언어들은 “기호(문자)”로 이루어져 있으며 기호는 0부터 무한대까지 표현가능한 수와는 달리 경우의 수가 무한하지 않고 한정되어 있습니다.

이 특성으로 인해 전세계의 모든 문자는 유한한 범위로 제한된 문자 집합(Character Set)으로 표현할 수 있습니다.

숫자밖에 다룰 수 없는 컴퓨터를 위해 우리는 숫자와 문자간의 대응관계를 나열해 놓은 테이블(Table)이 필요로 합니다.

문자 집합을 숫자로 주욱주욱 나열해놓은 테이블말이죠.

이를 위해 “부호화(Encoding)” 과정이 필요하게 되었습니다.

매트릭스의 네오처럼 세상이 숫자로 보일 정도면 컴퓨터와 직접 대화해도 된다

인코딩/디코딩(부호화/복호화)이란?

인코딩(부호화)은 바로 이것입니다. 정보를 어떠한 목적을 가지고 또 다른 형태의 정보로 변환(Transform)시키는 행위를 의미합니다. 숫자밖에 다룰 수 없는 컴퓨터를 위해 인간이 이해하기 위한 도구인 “문자”를 “숫자”로 변환하는 이 과정도 인코딩의 범주에 속합니다.

인코딩은 정보를 다른 정보로 변환하는것 디코딩은 다른 정보로 변환된 정보를 원래 정보로 다시 되돌리는것이다

“엥? 내가 예상했던 문자열 인코딩이랑은 개념이 다른데?” 라고 생각하셨을 수도 있을겁니다. 그렇다면 제대로 보셨습니다. 이것은 문자열 인코딩을 설명하는게 아닙니다. 일반적인 인코딩/디코딩의 개념을 설명하는겁니다.

컴퓨터를 위해 문자 여러개를 숫자로 인코딩하면 결과물로 문자와 숫자가 1:1로 대응되는 테이블이 나오게 됩니다.

이 테이블이 위에서도 여러번 언급했던 문자 집합(Character Set) 입니다.

문자 집합을 반복적으로 언급하는 이유는 문자 집합과 문자열 인코딩을 많은 사람들이 헷갈려 하기 때문입니다.

문자 집합과 문자열 인코딩은 다르다

아마 이 부분이 문자열 인코딩을 이해하는데 있어서 가장 헷갈리는 부분일겁니다.

문자 집합은 문자를 숫자로 매핑시켜놓은 테이블입니다! 문자를 숫자로 인코딩 한것은 맞지만 이게 문자열 인코딩은 아닙니다 !

문자 집합과 문자열 인코딩, 이 둘은 비슷하지만 사실 약간 의도가 다른 인코딩입니다.

예시를 들어 설명하는것이 가장 쉽고 전달이 쉬울것 같기에 가정을 해보겠습니다.

머나먼 지구 어딘가엔 평화로운 햇님나라가 있었습니다.

햇님나라 사람들은 오로지 A,B,C,D 4글자만으로 의사소통을 합니다. 어느날 햇님나라 사람들은 컴퓨터를 사용하고 싶었고 그들의 문자를 컴퓨터가 이해할 수 있게 숫자로 변환(인코딩) 했습니다. A는 10, B는 20, C는 30, D는 40 으로 말이죠.

햇님나라 사람들은 이렇게 만든 테이블을 정리해놓고 “햇님 표준전산 문자집합”이라고 이름 붙혔습니다!

햇님 표준전산 문자집합 A 10 B 20 C 30 D 40

햇님나라에서 사용되는 컴퓨터들은 이제 20을 B로, 40을 D로 인식할 수 있게 되었습니다.

ACDDB라는 문자를 표현하고 싶을때 1030404020 으로 컴퓨터에게 전달하면 컴퓨터는 이걸 디코딩하여 ACDDB로 표시 해주었습니다.

그렇게 한동안은 잘 사용하는듯 싶었습니다… 그런데 어느날 햇님 나라 프로그래머들은 글자를 표현하려면 항상 10, 20, 30, 40 두글자를 써서 글자를 표현해야 하는점이 몹시 불편했습니다. 프로그래머들은 이걸 어떻게 해결할 수 없을까 하는 고민에 빠지게 되었고 어떤 프로그래머가 숫자 뒤에 0을 빼버린 전산 문자 집합을 새롭게 정의하자고 제안합니다!

프로그래머들끼리 수근수근대는 가운데 한 프로그래머가 말합니다.

“지금까지 쭈욱 사용해왔던 ‘햇님 표준전산 문자집합’을 변경해버리면 지금까지 A 문자를 표현하는데는 10 하나 밖에 없었는데 옛날에 만들었던 프로그램들은 새롭게 바뀐 숫자 1을 문자 A라고 절대 인식 못할거에요! 분명 엄청나게 헷갈릴겁니다! 그래서 저는 반대에요”

하고 항변합니다. 음….. 일리가 있는 말이군요! 문자집합이 이중화 되면 바꾸는데 정말 많은 에로사항이 생길건 확실해보입니다.

그때 조용히 있던 프로그래머가 입을 뗍니다.

“사실 문제가 생기는 부분은 우리가 사용할때 불편해서 그런거잖아요? 그럼 우리끼리 정보를 주고 받을때, 정보를 저장할때만 저희가 한번 더 변환하면 어때요? 우리끼리는 편하게 주고 받다가 나중에 실제로 컴퓨터가 인식해야 할때만 다시 문자집합으로 변환 해주면 되지 않겠어요?”

모두들 조용히 고개를 끄떡입니다. 다들 수긍하는 분위기네요.

그렇게 햇님나라 프로그래머들은 모여서 “햇님 표준 인코딩 방식”을 제정합니다.

햇님 표준 인코딩 방식 10 1 20 2 30 3 40 4

이제는 ACDDB 표현하기 위해서 13442로 표현하면 되었습니다. 프로그래머가 만든 프로그램들간에는 햇님 표준 인코딩 방식이 적극적으로 사용되었고 13442를 컴퓨터에 표시해야 하는 시점에 햇님 표준전산 문자집합인 1030404020으로 디코딩하였고 이를 다시 ACDDB로 디코딩 해주니 정상적으로 글자가 표시되었습니다.

여기까진 좋았습니다. 그런데 아뿔싸,,, 컴퓨터 로직에 문제가 생겨서 1~4까지의 숫자가 다른 용도로 사용되어야 하는 상황이 발생하고 말았습니다. 이 문제 때문에 특정 프로그램들은 정상적으로 문자 A,B,C,D가 출력되지 않는 버그가 생기고 말았습니다.

이에 햇님나라 프로그래머들은 문제점 해결을 위해 다시 뭉쳐서 머리를 모았습니다.

하지만 이번에는 처음과는 달랐습니다. 큰 고민없이 문제를 해결하기 위해서 간단하게 0을 빼고 5씩을 더한 “햇님 꼼수 인코딩 방식”을 정의하고 사용하기로 서로 약속했습니다.

햇님 꼼수 인코딩 방식 10 6 20 7 30 8 40 9

ACDDB를 68997로 표현했고 위와 같은 원리로 문자집합으로 디코딩하여 1030404020을 다시 ACDDB로 표현할 수 있었습니다.

이렇게 햇님나라 프로그래머들은 “꼼수 인코딩 방식”, “표준 인코딩 방식”을 상황에 따라 번갈아 가며 사용하여 문자열 깨짐 버그없이 프로그램을 짤 수 있었고 덕분에 야근하지 않고 6시에 칼퇴해서 오래오래 행복하게 잘 살았답니다….

아무래도 예시가 좀 구린거 같다…

예시를 만들기 위해서 다소( 꽤많이 ) 과장했지만 문자집합과 문자열 인코딩이 어떤 차이점이 있는지 비유적으로 설명하기 위해 노력했습니다. ( 노력 많이 했는데 알아주시면 감사합니다. )

위 예시를 읽다보면 이런 의문이 들 수 있습니다.

“엇! 그러네! 문자열 인코딩을 왜 하죠? 사실 문자를 숫자로 변환하는 과정이 이미 인코딩 한건데 그걸 한번 더 인코딩 하는거 아닙니까?”

정말 날카로우시네요! 정확하게 맞습니다! 컴퓨터가 이해할때 필요한 문자 집합을 새로운 규칙을 통해 한번 더 인코딩 하는 과정이 바로 “문자열 인코딩” 입니다.

사실 우리는 문자 집합을 만드는 과정에서 이미 한번 인코딩을 했습니다. 위에서 언급했듯이 문자 집합을 만드는 과정 또한 컴퓨터에게 문자를 인식시키기 위한 인코딩이 맞기 때문입니다. 그렇기 때문에 문자집합과 인코딩이 동일한 경우도 있습니다! 대표적으로 바로 아래에서 설명할 누구라도 들었을 ASCII 인코딩이 그렇습니다. ^0^

하지만 문자열 인코딩을 구태여 한번 더 하는 이유는 이렇게 했을때 얻을 수 있는 좋은 장점이 있기 때문입니다~!

이 장점에 대해서는 뒤에서 자세히 설명하도록 하겠습니다.

글이 길어 짧게 3줄 요약 해보겠습니다.

1. 문자 집합을 만드는 것도 인코딩이다.

2. 문자열 인코딩은 인코딩 된 문자 집합을 한번 더 인코딩 하는것이다.

3. 문자 집합과 문자열 인코딩이 같은 경우도 있다. (즉, 별도의 문자인코딩 없이 문자 집합을 그대로 쓰는 경우도 있다)

태초에 ASCII가 있었다

최초의 문자집합인 ASCII(American Standard Code for Information Interchange) 테이블은 가장 대표적인 문자집합이자 인코딩 입니다.

printf 를 타이핑하던 추억의 그때가 기억나십니까?

컴퓨터가 발명된 영미권에서 문자를 표현하기 위해 아주 초창기에 도입된 암모나이트급 문자집합입니다.

워낙 유명하고 모르는 사람이 거의 없을것이기 때문에 구구절절히 설명하진 않겠습니다.

문자집합과 인코딩이 똑같은 형태이고 7비트의 고정길이를 가지고 있습니다.

얘는 좋은데, 한글 표현이 안되요.. ㅜㅅㅜ

한글을 표현하기 위한 눈물나는 노력

ASCII 코드가 널리 사용되었지만 곧 컴퓨터가 세계적으로 보급되면서 영문자가 아닌 문자들을 표현하려는 노력 또한 세계 곳곳에서 이루어지기 시작했습니다. 세계 각국에서 자신들의 문자 체계를 표현할 수 있는 독자적인 문자 집합을 정의하게 되었고 세계는 문자전국시대에 접어들게 됩니다.

이 혼란스러운 와중에 한국에서도 한글 표현을 위한 문자집합 제정에 대한 논의가 오고 갔습니다.

한글을 표현을 위해 문자 하나당 몇 바이트를 할당할 것이며 문자집합에 어떤 문자를 담을것인가?를 말입니다.

오랜 논의 끝에 1987년 대한민국 국가기술표준원에서는 한글자당 2byte의 고정길이를 가지는 “한국 표준 문자집합” “KSC 5601-1987″을 제정하는데….

1행, 2행: 각종 기호

3행: 전각 ASCII 문자(백슬래시(\)를 원화 기호(₩)로, 물결표(~)를 오버라인( ̄)으로 바꿈)

ASCII 문자(백슬래시(\)를 원화 기호(₩)로, 물결표(~)를 오버라인( ̄)으로 바꿈) 4행: 한글 자모

한글 자모 5행: 로마 숫자, 그리스 문자

그리스 문자 6행: 괘선 기호

7행: 단위 기호

8행: 확장 라틴 문자 대문자, 동그라미 안 한글·라틴 문자·숫자, 분수 기호

라틴 문자 대문자, 동그라미 안 한글·라틴 문자·숫자, 분수 기호 9행: 확장 라틴 문자 소문자, 괄호 안 한글·라틴 문자·숫자, 위 첨자와 아래 첨자

10행: 히라가나

히라가나 11행: 가타카나

가타카나 12행: 키릴 문자

키릴 문자 16행 ~ 40행: 한글 2,350자 ??!

42행 ~ 93행: 한자 4,888자 (왜 한글보다 한자가 더 많냐…(⊙_⊙)?)

2,350자가 충분하다니… 미쳤습니까 휴먼?

무려 표준으로 정의된 문자집합이 표현할 수 있는 한글의 가짓수가 2,350자로 제한되어 표현에 심각한 제약이 생기는 차마 눈물 없이는 볼 수 없는 상황이 발생하고야 말았습니다. 이는 표현해야 할 전체 한글 가지수의 21% 밖에 되지 않는 수치입니다.

이로인한 재미난 이야기거리도 있는데 1991년도 까지는 우리가 지금 “펩시콜라”로 알고 있는 브랜드의 정식 명칭이 원래는 “펲시콜라” 였습니다.

1991년도 펲시콜라 광고이다. 당시 한글 표현으로는 ‘펲’을 표현할 수 없었다.

그런데 1992년부터 펩시콜라로 바뀌었다고 하는데 그 이유가 한글 표준 문자집합에 “펲” 자가 누락되어 있어 펲시를 펲시라 부르지 못했기 때문에 “펩시콜라”로 바뀌었다는 그런 (출처는 불분명한) 우스갯소리도 있습니다.

농담조의 루머겠지만 실제로 컴퓨터를 통해 한글을 표현할때 이따금씩 이런 표현의 불편함을 겪은 것은 사실입니다.

더불어 문자열 인코딩 방식에 있어서도 뜨거운 논쟁이 오고갑니다.

한국이 다른나라들 보다 더 어려웠던 것이 글자를 선상에 순서대로 주르륵 나열하면 되는 영어, 한자와는 달리 한글은 문자 특성상 자음과 모음을 조합하여 글자를 표현할 수 있었기 때문에 초성 + 중성 + 종성을 조합해서 한글을 표현하자는 조합형 한글 인코딩파와 모두 합쳐서 완성된 문자로 표현하자는 완성형 한글 인코딩파 두 갈래로 나뉘어 갈피를 잡지 못하고 있었기 때문입니다.

“사랑해”라는 한글 문자열을 인코딩할때

조합형 한글 인코딩파는 “ㅅ”+”ㅏ”+”ㄹ”+”ㅏ”+”ㅇ”+”ㅎ”+”ㅐ”로 표현하자는 것이었고

완성형 한글 인코딩파는 “사”+”랑”+”해” 로 표현하자는 것이었습니다.

이 둘은 첨예하게 대립하였으며 각자 자신이 주장하는 인코딩의 우수성과 반대편 인코딩의 단점을 열거하며 디스전을 펼쳐갔습니다.

조합형 한글 인코딩파

조합형의 장점

1. 조합형을 사용하면 자음과 모음의 모든 조합을 표현할 수 있기 때문에 표현 가능한 한글 가지수는 160만개가 넘는다. (아니 근데, 한글 조합이 그렇게 많았어? 한국인들 단체로 동공지진 (⊙_⊙;;))

2. 조합형을 쓰면 사라졌던 옛한글도 표현할 수 있지롱~

완성형의 단점

1. 너넨 옛한글 표현 못하잖아? ㅎㅎ 나랏〮말〯ᄊᆞ미〮 해봐!! 나랏〮말〯ᄊᆞ미〮!!

2. 완성형 너넨 미리 조합되어 있는 문자가 아니면 나타낼 수 있는 방법 자체가 없잖아? 그에 비해서 우리는 조합해서 나타낼 수 있다고. (물론 “나타낼 수” 있다고 했지 보여줄 수 있다곤 안했다. ㅎㅎ)

완성형 한글 인코딩파

완성형의 장점

1. 우린 초중종성을 해석하는데 들어가는 부하를 줄일 수 있다. 한글 한글자를 표현할때마다 최소 2개(초+중)에서 최대 5개(초+중1+중2+종1+종2) (ex) 뷁)) 의 한글 문자를 해독해야 되는데 완성형을 쓰면 한글자씩 해독 없이 편하걸랑~ ^^ 부럽니? 부러우면 부럽다고해~ ^^

조합형의 단점

1. 160만가지의 한글은 “이론상”이나 가능한거고 실제로 한글 조합으로 표현할 수 있는 가짓수는 1만개가 조금 넘는 수준이다. 만들 수도, 쓸 수도 없는 문자 조합해서 뭐하냐? ㅎㅎ

2. 아니~ 시대가 어느 시댄데 옛한글을 요즘 누가 쓰냐 ㅡㅡ “라떼는 말이야~ 나랏〮말〯ᄊᆞ미〮듕귁〮에〮달아〮문ᄍᆞᆼ〮와〮로〮 서르 ᄉᆞᄆᆞᆺ디〮 아니〮 했어~ 요즘 것들은~~ㅉㅉ” 라도 쓰고 싶은거냐? 너무 오버하는거 아니냐~ 그리고 못하는게 아니라 안하는거야! 비효율적이어서 안하는거라고!

3. 자모 하나하나 조합해서 언제 한글자 만들래? 너 CPU가 차~암 좋은가보다?? 어휴 비효율~!!

4. 그리고 조합형 안에서도 인코딩이 여러개인데 용량도 각자 다르고 대충 봐도 엄청 복잡한데 정말 표준 맞출 수 있겠어?

결국 이 과정속에서 완성형파는 “청계천 한글”이나 그 유명한 “EUC-KR”, “CP949(MS949)” 같은 완성형 한글 인코딩 방식을 사용하게 되었고 조합형파도 나름대로 “3바이트 조합형”, “2바이트 조합형”, “N바이트 조합형” 같은 조합형 인코딩 방식을 사용하면서 한글 표현 대혼란기가 도래하고 말았습니다.

서로 다른 인코딩을 쓰는 프로그램간에는 당연하게도 정상적으로 한글을 표현할 수 없는 호환성 문제가 발생했고 이는 한글 표현이 어려워지고 프로그램의 잔버그가 많아지게 되는 원인을 제공했습니다.

혼란의 한글 인코딩

하지만 문제는 지금부터 시작이었습니다. 인코딩을 통일시키고 제한된 한글 문자집합 내의 엄선한 단어들만 표현한다고 하더라도 피할 수 없는 치명적인 문제였습니다. 문제는 한글 표시를 위해 “한글 표준 문자집합”을 사용하여 개발된 프로그램은 해당 문자집합 내에서 표현 가능한 한글, 영어, 한자 일부, 일본어 일부의 제한된 글자만 표현할 수 있다는 점입니다. 아무리 한글이 과학적이고 자랑하고 싶은 언어라고 하더라도 다른 나라 사람들은 이해할 수 없는 문자입니다. 때문에 외국인들을 위해 다른 나라의 문자 또한 표현해야 합니다. 프로그램은 점점 글로벌화 되어 지역을 벗어나 외국의 문자들까지 포괄해야 하는 상황에 놓이게 되었습니다.

한글, 영어, 일본어, 중국어 말고도 그리스, 터키, 프랑스, 독일, 베트남, 인도 등등… 타 국가의 문자들까지 지원하는 프로그램을 만들기 위해선 어떻게 해야할까요?

이를 위해서는 프로그램에서 표출되는 모~~든 문자열들을 각 국가별 표준 문자집합과 인코딩에 맞게 변환하여 관리해야 합니다. 이는 엄청나게 번거로울 뿐더러 굉장히 버그 발생 가능성이 높은 하기 짜증 나는 일입니다.

이렇게 엄청난 노력을 들여서 국가별 표준 문자집합과 메인스트림 인코딩을 사용한다고 하더라도 근본적인 문제는 해결할 수 없습니다. 특정 A라는 문자집합을 통해 표현된 문자열은 다른 B라는 문자집합과 호환되지 않습니다.

예를들면, 한글 표준 문자집합에는 인도 문자는 존재하지 않으므로 한글과 인도 문자를 동시에 표시하는것은 절대 불가능한 일이 되어버렸습니다. 즉, 문자 집합의 한계가 표현의 한계였습니다.

(비단 한국만의 이야기는 아니었습니다. 이러한 문자집합의 지역성은 프로그램의 세계화를 발목 잡는 큰 걸림돌이었습니다.)

문자집합의 지역성은 프로그램의 세계화를 방해했다

머리 좋은 컴퓨터 공학자들이 이 파국으로 치닫는 상황을 좌시할리 없습니다.

이를 극복하기 위한 대안을 내놓습니다.

이 혼돈의 카오스를 끝내러 왔다, 유니코드의 등장

유니코드의 탄생 배경을 알기 위해 먼길 오셨습니다. 유니코드는 갈수록 세계화, 일반화 되어가는 프로그램 내에서 문자의 일관성 있는 처리를 위해 고안된 모든 국가에서 사용되는 문자들을 포함하는 문자집합입니다.

문자집합이 세상에 존재하는 모든 문자 체계를 포괄할 수 있다면 문자열 안에서 한글, 힌디어, 한자, 히라가나, 베트남어 등을 모두를 표현할 수 있을것입니다.

유니코드는 전세계 모든 문자를 표현하는 문자집합 이다

“엥?! 잠시만요! 전세계의 모든 문자들을 표현한다구요? 그게 가능한가요? 문자들이 엄청 많을것 같은데요?”

물론 국가별로 사용하는 문자들이 많지만 예상과는 다르게 문자의 개수가 천문학적으로(말도 안되게) 많지는 않습니다. 그 이유는 세계에서 사용되는 대부분의 문자들이 소리를 표현한 표음문자(소리글자)이기 때문입니다. 세계 대부분의 언어들은 그 체계가 달라도 소리를 기호화 한 자음과 모음을 조합한 형태로 단어를 표현하고 있습니다. 아무리 자음과 모음의 종류가 나라별로 다양하다고 하더라도 사람의 구강 구조상 발성 방법에는 한계가 있기 때문에 그 가짓수가 대개는 수십가지 정도에 그칩니다. 때문에 표음문자는 생각보다는 자모의 가짓수가 많지 않아 유니코드에 전세계의 대부분의 문자를 담는게 가능한 것입니다.

소리를 표기하는 표음문자는 글자를 표기하는데 큰 장점이 있다.

유니코드의 크기는 얼마나 될까?

우선 유니코드가 얼마나 많은 가짓수를 표현할 수 있는지 알아야겠군요? 유니코드는 글자 하나당 2~3byte의 크기를 가집니다. 가장 작은 2byte는 16비트이고 대략 65,500가지가 조금 넘는 문자를 표현할 수 있습니다.

2바이트(16비트)로는 최대 65536 가지 경우의 수를 표현할 수 있다.

어라?! 2byte면 위에서 언급했던 “한국 표준 문자집합”과 같은 크기입니다. 겨우 한글을 2,350자 밖에 표현할 수 없었던 바로 그 문자집합이요! 같은 2byte인데 유니코드는 도대체 어떻게 이루어져 있길래 이게 가능한걸까요?

아무래도 유니코드의 구조에 대해서 조금 더 알아봐야 될것 같습니다.

유니코드의 구조

유니코드는 평면이라고 하는 세부 영역으로 나누어 관리되고 있습니다. 크게 기본평면(Basic Multilingual Plane)과 보조평면(Supplementary Multilingual Plane)으로 나눠져 있습니다.

기본평면, BMP(Basic Multilingual Plane)

유니코드에서 가장 자주 사용되고 핵심이라고 볼 수 있는 0~2바이트까지의 영역을 BMP 혹은 “다국어 기본 평면” 영역이라고 합니다. 거의 대부분의 문자들이 해당 영역에 정의되어 있습니다.

유니코드는 16진수로 표시할 수 있는데 앞에 유니코드임을 의미하는 U+기호와 16진수를 합쳐 표시합니다.

범위가 2byte 까지이므로 4개의 16진수로 표현가능한 범위 즉, U+0000 ~ U+FFFF 안에 속하는 유니코드 문자가 바로 다국어 기본 평면에 해당합니다. 아래 표를 보면 비어있는 공간이 거의 없이 빼곡하게 차있는 것을 확인할 수 있습니다.

이 영역에는 라틴 문자, 동아시아 문자, 중동 문자, 특수기호, 한자, 동남아시아 문자, 중앙아시아 문자, 아프리카 문자 등 다양한 문자들이 정의되어 있습니다.

유니코드 앞의 2자리 16진수(Most Significant Byte) 별로 나눈 BMP 테이블 카테고리

보조평면, SMP(Supplementary Multilingual Plane)

SMP는 3바이트의 영역을 가지는 “다국어 보조 평면” 영역입니다. U+10000 ~ U+1FFFF 의 영역을 가지며 2byte라는 공간 제약상 BMP에 모두 담을 수 없었던 문자들(한자, 중앙아시아 문자 등)을 추가적으로 표현하기 위해 사용되는 평면입니다. 또한 특수문자나 이모티콘(이모지), 기호들도 정의되어 있습니다.

유니코드 앞의 3자리 16진수 별로 나눈 SMP 테이블 카테고리

SMB 영역에 정의되어 있는 특수문자와 기호들

이렇듯 유니코드는 크기가 2byte 고정이 아닌 2~3 byte로 가변적인 크기를 가지고 있습니다!

한개의 평면은 최대 2byte의 표시 범위를 가지며 유니코드는 3byte까지 표현 할 수 있으므로 BMP(U+000000~U+00FFFF)를 제외하고도 U+01~FF까지 총, 255개의 평면을 추가로 표현할 수 있습니다.

때문에 U+AABBBB로 표현되었을때 AA는 평면 인덱스, BBBB는 문자 인덱스 로 인식하면 됩니다.

아래 표를 통해 보조 다국어 평면(SMP:U+01) 말고도 보조 표의문자 평면(SIP:U+02), 표의문자 평면(TIP:U+03), 보조 특수 문자 평면(SSP:U+14), 사용자 자유 영역(PUA:U+15~16) 등을 확인할 수 있습니다.

3byte의 경우의 수는 16,777,216(1,677만) 가지나 되기 때문에 현재 대부분의 평면은 비어있습니다.

유니코드에서 한글의 비중은 어떻게 될까?

유니코드의 BMP 영역이 사실상 유니코드의 정수라는 것을 이해 하셨을겁니다. BMP 영역은 대부분의 문자들이 들어있는 영역이니까 해당 영역 안에 한글이 들어가 있을겁니다. 전세계 모든 문자를 포함하는 유니코드에서 한글은 어느 위치에서 어느정도 비중을 차지하고 있을까요?

비중이 높을까요? 낮을까요? 놀라지 마세요~! 한글은 BMP 영역의 무려 17%나 차지하고 있답니다!!!!

17%는 전체 표현가능한 65,536가지 중 11,184가지이며 이는 상당한 수치임을 대략적으로 봐도 인지할 수 있습니다.

BMP에서 한가닥 하는 한글의 위엄

무려 17%나 차지하는 한국이 BMP 구역 최강자가 되지는 못했는데 불행히도 너무나도 강력한 경쟁자가 있었기 때문입니다… 그 경쟁자는 바로……

여기서 69%란 2바이트로 표현 가능한 유니코드 영역(BMP)중 차지하는 비율을 의미합니다!

표의문자인 한자를 사용하는 중국과 한자를 히라가나와 함께 혼용하는 일본입니다. 정말 재미있게도 한자문화권인 이 동아시아 삼개 국가가 BMP영역의 69%를 차지하고 있습니다. 이렇게 보니 정말 엄청난 욕심쟁이들네요. ^0^ ㅋㅋㅋㅋ

사실 한자야 뭐 워낙 문자 개수도 많고 중국인들 조차도 배우기 어렵다고 인정하는 글자인 만큼 개수가 많은건 알겠는데 한글은 왜 이렇게 개수가 많은걸까요? 한글의 자모는 합쳐서 24개 밖에 되지 않는데 말이죠~! (⊙_⊙)?

그 이유는 한글은 표음문자이지만 독특하게도 자모를 합쳐서 한글자씩 표현하기 때문입니다. 글자는 자모를 나열하여 만들지만 표현은 한자처럼 한글자씩 표현하니까요. 이는 다른 언어에서 찾아보기 힘든 한글만의 독특함이라고 할 수 있습니다. 그래도 정말 다행인것은 한자처럼 계속해서 새로운 뜻을 가진 문자가 생기는 것이 아니기에 정확히 11,172가지의 닫힌 문자집합으로 표현할 수 있다는 점입니다.

유니코드 BMP 영역에서 한글의 위치는 시작 글자인 “가”인 U+AC00 부터 “힣” (힣히히히힣) 까지인 U+D7A3 까지 범위입니다. (유니코드 한글 실라버스 에서 확인 가능합니다.)

한글의 시작인 “가”는 U+AC00 이다. 한글의 마지막은 U+D7A3 인 “힣” 이다

이렇게 세계는 유니코드를 통해 일관성을 가지고 전세계의 모든 문자를 표현할 수 있었고 점점 더 유니코드를 사용하는 쪽으로 기울게 되어 현재는 문자열 표현의 표준이 되었습니다.

유니코드의 세부적인 정보는 공식 홈페이지 home.unicode.org/ 에서 확인 하시면 됩니다.

아참, 그래서 조합형 VS 완성형 인코딩파의 전쟁은 누구의 승리로 끝났냐구요?

유니코드의 든든한 지원을 업은 완성형 인코딩파의 압도적인 승리로 막을 내리게 되었답니다. ㅎ_ㅎ (조합형 지못미…)

여담이지만 이렇듯 11,172자의 많고 아름다운 양으로 인해 한글 폰트를 만드는 작업은 굉장한 노력과 인내를 필요로 하는 작업이 되었습니다. ㅎㅅㅎ

한글폰트들이 유독 유료가 많은 이유.jpg 영문 폰트 제작 작업량(비하 의도는 없습니다. 오해 ㄴㄴ요)

유명한 문자 집합과 그 인코딩 방식을 정리한 표

문자 집합(Character Set) 인코딩 방식 특징 CP437(Code Page 437)

(www.ascii-codes.com/) ASCII 7비트 고정길이 인코딩

영문자만 표현 가능 KS X 1001(KSC 5601-1987) KS_X_1001.pdf 2.75MB EUC-KR 2바이트 고정길이 인코딩

한글 2,350자 밖에 지원하지 않는다 (세종대왕님이 통곡하실듯)

한자는 4,888자 지원 통합형 한글 코드(Unified Hangul Code) CP949(MS949) 모든 한글(11,172자) 지원

모든 한글을 지원하기 위해 Microsoft 주도로 만들어진 문자 집합이면서 인코딩 방식이다

EUC-KR의 상위집합(SuperSet)으로 모든 EUC-KR 문자를 포함한다

표준은 아니지만 한때 표준처럼 사용되었음(특히, 윈도우 기반 운영체제에서) 유니코드(Unicode)

(www.unicode.org/charts/)

(유니코드 한글 실라버스) UTF-8 1~4바이트 가변길이 인코딩

ASCII 인코딩과 호환성을 가짐

동아시아권 문자들이 3바이트로 표현 UTF-16 2 or 4byte 고정길이 인코딩

한글이 2byte로 고정 UTF-32 4byte 고정길이 인코딩

모든 문자가 동일하게 4byte임

유니코드 인코딩에 대하여 설명하기에 앞서…

우리들은 개발자입니다. 개념을 학습하고 이해하는 것이 가장 중요하지만 단순히 이해만으로는 충분하지 않습니다.

문자열 인코딩이 실제 프로그램과 파일에서 어떻게 이루어지고 또 개발자인 우리가 그 의미를 해석하는 방법을 익히는것 또한 중요하겠지요.

앞으로는 유니코드 인코딩이 어떤 종류가 있고 왜 이렇게 인코딩이 다양하며 각 인코딩마다 어떤 특징이 있는지에 대해 설명할 예정입니다. 또한 인코딩이 컴퓨터 어느 부분에 영향을 미치고 어떻게 식별가능하며 코드에서 어떻게 다루어야 하는지에 대해서도 짚고 넘어갈 것입니다. 하지만 이를 위해서는 실제로 컴퓨터에서 이뤄지는 비트 수준의 문자열 처리를 이해해야합니다. 이제부터는 실제 컴퓨터 단에서 처리되는 내용이 중점적으로 나올 예정입니다.

글을 이어가며 하나의 글로 끝을 내고 싶었지만 분량이 계속해서 늘어가기 때문에 이쯤에서 잠시 쉬어가는게 좋다고 생각했습니다. 때문에 이어지는 내용은 다음글에서 정리하도록 하겠습니다.

긴 글 읽어주셔서 감사합니다. 다음글에서 뵙겠습니다! (^0^)/

유니코드 문자 인코딩

유니코드 문자 인코딩 표준은 사용 중인 거의 모든 세계 언어의 문자를 포함하는 고정 길이의 문자 인코딩 체계입니다.

유니코드에 대한 정보는 유니코드 표준 최신 개정판과 유니코드 컨소시엄 웹 사이트(www.unicode.org)에 있습니다.

유니코드는 인코딩되는 데이터의 데이터 유형에 따라 두 개의 인코딩 양식(8비트 및 16비트)을 사용합니다. 기본 인코딩 양식은 16비트로, 각 문자는 16비트(2바이트)이며 보통 U+hhhh로 표시됩니다(여기서, hhhh는 문자의 16진 코드 포인트입니다. 65,000개 이상의 코드 요소 결과로도 세계 주요 언어의 문자 대부분을 인코딩할 수 있을 정도로 충분하지만 유니코드 표준은 무려 백만 개가 넘는 문자를 인코딩할 수 있는 확장 메커니즘도 제공합니다. 확장 메커니즘은 한 쌍의 상/하위 대리 문자를 사용하여 하나의 확장 또는 보조 문자를 인코딩합니다. 첫 번째(또는 상위) 대리 문자는 U+D800에서 U+DBFF 사이의 코드 값을 가지며, 두 번째(또는 하위) 대리 문자는 U+DC00에서 U+DFFF 사이의 코드 값을 갖습니다.

UCS-2 국제 표준화 기구(ISO) 및 국제 전기기술 위원회(IEC) 표준 10646(ISO/IEC 10646)은 16비트(2바이트) 버전(UCS-2)과 32비트(4바이트) 버전(UCS-4)이 있는 UCS(Universal Multiple-Octet Coded Character Set)를 지정합니다. UCS-2는 대리가 없는 유니코드 16비트 양식과 동일합니다. UCS-2는 유니코드 버전 3.0 레퍼토리에 정의된 모든 (16비트) 문자를 인코딩할 수 있습니다. 유니코드 버전 3.1부터 도입된 새 보조 문자를 각각 인코딩하려면 두 개의 UCS-2 문자(상위 대리 다음에 하위 대리가 옴)가 필요합니다. 이러한 보조 문자는 원래 16비트 BMP(Basic Multilingual Plane 또는 Plane 0) 외부에 정의됩니다.

UTF-16 ISO/IEC 10646은 두 개의 UCS-2 문자를 사용하여 일부 UCS-4 문자를 인코딩하는 확장 기술도 정의합니다. UTF-16이라는 이 확장은 대리가 있는 유니코드 16비트 인코딩 양식과 동일합니다. 요약하면 UTF-16 문자 레퍼토리는 모든 UCS-2 문자에 대리 쌍을 통해 액세스할 수 있는 백만 개의 문자를 더한 것입니다. 16비트 유니코드 문자를 바이트로 직렬화할 때 어떤 프로세서는 최상위 비트를 처음 위치에 배치(빅 엔디안(big-endian) 순서라고 함)하는 반면 다른 프로세서는 최하위 비트를 먼저 배치(리틀 엔디안(little-endian) 순서라고 함)합니다. 유니코드의 기본 바이트 순서는 빅 엔디안(big-endian)입니다.

UTF-8 16비트 유니코드 문자는 바이트 지향 ASCII 기반 애플리케이션과 파일 시스템에 중요한 문제점을 제기합니다. 예를 들어, 비유니코드 인식 애플리케이션은 대문자 ‘A'(U+0041)의 선행 8개 영(0) 비트를 1바이트 ASCII NULL 문자로 잘못 해석할 수 있습니다. UTF-8(UCS 변환 형식 8)은 고정 길이 유니코드 문자를 가변 길이 ASCII 안전 바이트 문자열로 변환하는 알고리즘 변환입니다. UTF-8에서 ASCII 및 제어 문자는 보통 1바이트 코드로 표시되지만 다른 문자는 2바이트 이상입니다. UTF-8은 비보조 및 보조 문자를 모두 인코딩할 수 있습니다. UTF-8 문자는 최대 4바이트입니다. 비보조 문자는 최대 3바이트이며 보조 문자는 4바이트입니다.

[Web] 비트와 바이트, 문자 인코딩이란?

들어가며

누군가 홈페이지에서 “뛣뷁꿇꼶꺎….”와 같은 이상한 문자가 나오는 것은 왜 그런 것인가 저에게 물었던 적이 있습니다. 개발을 하면서 아주 간단한 부분조차 제대로 설명할 수 없다는 것을 깨달을 때가 있습니다. 항상 대충 알고만 넘어갔던 부분들을 이제는 제대로 알아야겠다고 생각했습니다. 지금부터 비트와 바이트, 그리고 문자 인코딩에 대해 알아보겠습니다.

아리송한 데이터의 단위 ‘바이트(Byte)’

비트와 바이트

컴퓨터가 이해할 수 있는 최소의 정보 단위는 0과 1밖에 없습니다. 컴퓨터는 0과 1의 조합으로 이루어진 정보들을 처리할 수 있습니다. 컴퓨터가 처리할 수 있는 가장 작은 단위의 정보를 나타내는 것이 bit입니다. 비트는 0 또는 1이라는 정보를 담을 수 있습니다. 그리고 이런 2진수(Binary Digit)들이 모여서 조금 더 큰 범위의 데이터를 담을 수가 있습니다.

1비트는 0과 1. 2종류만 담을 수 있고, 2가지의 비트로는 (0, 0), (0, 1), (1, 0), (1, 1) 총 4가지를 담을 수 있습니다. 경우의 수 공식을 이용하면, 한 비트당 2가지의 경우를 나타내므로 2×2는 4. 즉 총 네 가지의 경우로 나타낼 수 있습니다. 3비트로는 2x2x2의 경우 8가지의 경우를 나타낼 수 있습니다.

컴퓨터에서 데이터를 처리할 때 가장 기본적인 단위를 1 바이트라고 이야기하는데, 1바이트는 8비트로 구성되어있습니다. 256가지의 다른 수를 담을 수 있으므로 숫자 0부터 시작한다면 255까지의 정보를 나타낼 수 있습니다.

그렇다면, 비트와 바이트의 용량은 어떻게 표기할 수 있을까요? 이에 대해 알아보겠습니다.

아리송한 데이터의 단위 ‘바이트(Byte)’

Mega Mebi

만약 1바이트에서 1024를 곱해본다고 가정해보겠습니다. 1바이트에서 1024를 곱한 것이 1KB입니다. 1KB에 1024를 곱한 것이 1MB가 됩니다. 동일하게 1024를 곱하면 1GB가 되며 여기에 1024를 곱하면 1TB가 됩니다. 이 부분은 운영체제에서 사이즈를 확인할 때 주로 볼 수 있습니다.

하지만 2진수는 컴퓨터를 사용하는 사용자들에게 익숙하지 않으니, 사용자들에게 조금 더 익숙한 10진수 단위로 곱해진 단위로 환산해보겠습니다. 만약 1바이트에 1000을 곱하면 1KB가 되고, 여기에 1000을 곱해서 1MB가 됩니다. 이런 사이즈들은 외장 디스크나 USB에 표시됩니다. 예전에는 컴퓨터의 용량이 적었기 때문에, 차이가 큰 문제점은 아니었습니다. 1000바이트와 1024 바이트는 큰 차이가 없을 수 있지만, 테라바이트를 이야기한다면, 1000GB와 1024GB에는 큰 차이가 있을 수 있습니다.

예를 들어 100MB의 USB를 사서 운영체제에 넣었더니 실제로 내가 저장할 수 있는 사이즈는 95.37MB 밖에 안 뜨는 경우가 있었습니다. 이런 혼돈을 잠재우고자 IEC에서 다른 표기법을 제안합니다. KB와 MB는 사람들이 쓰던 10진수 단위로 남겨두고 바이너리 형태로 이야기할 땐 Kibibyte, mebibyte, gibibyte, tebibyte라고 이야기하자 약속을 하게 됩니다.

지금까지 0과 1을 얼마나 저장할 수 있는가에 대해 알아봤다면, 지금부터는 어떻게 하면 문자를 2진수로 나타낼 수 있을까? 에 대해 알아보겠습니다. 이를 위해 나타난 것이 바로 ASCII입니다.

ASCII와 Unicode

ASCII에서 알파벳 A는 1000001로 표기가 되며, 알파벳 N은 1001110으로 표기가 됩니다. 이것들은 사람들이 미리 약속해둔 테이블을 이용해서 서로 변환할 수 있습니다. 위의 ASCII 문자열 표를 활용해서 간단한 문자를 이진수로 나타낼 수 있습니다.

아스키코드에 들어있는 문자열은 1바이트로 모든 문자열을 표기할 수 있습니다. 하지만 아스키코드의 한계점이 존재합니다. 이 세상에는 정말 다양한 문자들이 있습니다. 하지만 아스키코드에는 모든 문자열이 들어있지 않습니다. 한국어도 여기에 포함되지 않습니다. 이를 위해 나온 것이 바로 유니코드입니다.

우리 지구 상에서 만날 수 있는 다양한 문자들을 포함하는 것이 유니코드입니다. 유니코드에 들어있는 문자열은 1바이트에 다 담을 수 없기 때문에 2바이트 또는 그 이상의 바이트를 이용해서 전체적인 문자열을 나타낼 수 있습니다. 유니코드에서는 아스키코드에 있는 문자열뿐 아니라 다양한 언어의 문자열을 포함하고 있습니다. 우리가 사용하는 심벌과 이모지 같은 것들도 포함되어 있고, 한글도 포함되어 있습니다. 이처럼 유니코드는 다양한 문자열들을 갖고 있습니다.

정리하자면 컴퓨터는 0과 1을 담는 비트라는 최소 단위를 갖고 있고, 비트를 여러 개 묶어서 더 많은 데이터를 저장할 수 있습니다. 컴퓨터 프로그래밍에서는 1바이트를 가장 최소의 단위로 잡고 보는데, 프로그래밍에서 변수를 선언할 때, 어떤 데이터 타입이냐에 따라 메모리에 얼마나 크게 공간이 확보되는지가 정해집니다. 임베디드나 메모리가 넉넉하지 못한 환경에서 동작하는 프로그램 같은 경우엔 데이터 타입을 알맞게 선택해서 효율적으로 작성하는 것이 중요합니다.

그렇다면, 우리가 어떻게 현존하는 많은 문자열들을 컴퓨터가 이해할 수 있게 인코딩할 수 있을까요? 그 규격을 약속하는 것이 Text Encoding입니다

UTF-8 vs UTF-16 Encoding | Which One is Prevalent?

Text Encoding

예전에는 각 나라별로, 언어마다 다양한 텍스트 인코딩이 존재했습니다. 그러다 보니 자국 언어에 맞는 인코딩 방식을 택하다 보니, 다른 언어를 쓰는 국가에서 홈페이지를 불러올 때, 언어를 이해할 수 없어서, 서로 다른 인코딩 규격 때문에 웹사이트가 깨지거나 한글문서가 읽어지지 않는 문제점들이 많이 발생했습니다. 이것을 해결하기 위해 나온 것이 UTF-8이라는 인코딩 방식입니다. unicode transformation for mat(8-bit)의 약자입니다. mat은 8비트를 말합니다. 즉, UTF-8은 유니코드를 인코딩하는 방식을 말합니다.

UTF-8은 기존 아스키뿐 아니라 모든 유니코드를 나타낼 수 있는 웹사이트에서 기본적으로 사용되고 있고 통상적으로 사용되고 있는 텍스트 인코딩입니다. UTF-8은 가변 길이 유니코드 인코딩 방식입니다. 즉 길이가 정해져 있지 않고 필요에 의해 길어질 수 있는 것을 말합니다. 모든 아스키코드는 7비트로 나타낼 수 있기 때문에 UTF-8에서는 1바이트로 다 표현할 수 있고, 유니코드의 경우 최소 2바이트부터 4바이트 까지 표현할 수 있습니다. 이처럼 UTF-8에서는 1바이트로 표현할 수 있다면 그대로 표현하고, 만약 2바이트 이상이 필요하다면 첫 번째 덩어리에서 10을 앞에다 붙여주고, 두 번째는 110을 붙여주면서 총문자를 나타내는데 몇 바이트가 필요한지 힌트를 줄 수 있습니다. 이처럼 UTF-8은 가변 길이이기 때문에 바이트가 더 필요하다면 데이터의 범위를 더 늘려서 더 많은 문자열을 나타낼 수 있고, UTF-16이라는 인코딩 방식이 있지만 이것도 가변 길이 이긴 하지만 기본적으로 2바이트를 사용하기 때문에 아스키와 같이 1바이트로만 충분히 표현할 수 있음에도 2바이트를 소모하게 됩니다. 그래서 UTF-8이 통상적으로 많이 이용됩니다.

마치며

공부를 하며 그동안 아주 기초적인 것들을 제대로 공부하지 않았다는 것을 깨닫습니다. 좋은 기술을 배우는 것도 좋지만, 기술의 기반이 되는 기초적인 지식을 먼저 쌓는 것이 중요하다는 것을 다시금 깨달았습니다. 기초가 튼튼한 개발자가 되고 싶습니다.

출처

키워드에 대한 정보 문자 인코딩

다음은 Bing에서 문자 인코딩 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 [볼륨주의] 문자 인코딩, 유니코드, UTF-8이 뭔가요?

  • 얄팍한코딩사전
  • 얄팍한 코딩사전
  • 얄팍한
  • 코딩사전
  • 코딩
  • 프로그래밍
  • 프로그래머
  • 코더
  • 개발자
  • 컴퓨터공학
  • 컴공
  • programming
  • programmer
  • developer
  • 개발
  • 허니커즈
  • coding
  • programming
  • programmer
  • developer
  • computer sceince
  • 얄코
[볼륨주의] #문자 #인코딩, #유니코드, #UTF-8이 #뭔가요?


YouTube에서 문자 인코딩 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 [볼륨주의] 문자 인코딩, 유니코드, UTF-8이 뭔가요? | 문자 인코딩, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment