말머리
올해 초 Git을 통해 협업을 하던 시절 한글과 관련된 하나의 문제가 있었다.
A : 주석에 한글이 꺠져서 왔는데?
나 : 나는 잘 보이는데..?
--A가 Push한 후--
나 : 보이지도 않고 복구도 안되네?
이때는 프로그램 개발이 바빠서 탐구할 시간이 없었는데 이번에 공부를 하면서 인코딩의 중요성을 깨달아 쓰게 되었다. (제목에 협업이 들어간 이유는... 어그로 일지도..?)
인코딩의 과거부터 현재까지 시간 순으로 쉽고 간단하게 작성하였습니다.
인코딩이란?
: 문자 인코딩은 문자들의 집합을 부호화하는 방법이다.
C를 해본 사람들은 알겠지만 프로그램에서 char가 가지는 값은 int와 다름이 없다. 이를 우리가 사용하는 문자로 보이게 하기 위해서 사용하는 것이 바로 인코딩이다.
1963년 미국 ANSI에서 ASCII (American Standard Code for Information Interchange)는 7비트 부호 체계를 만들어서 사용하였다.
ASCII (American Standard Code for Information Interchange)
: ASCII는 영문 알파벳을 사용하는 대표적인 캐릭터 인코딩 스킴( 컴퓨터에서 데이터를 표현하기 위한 규칙이나 방식 )입니다.
범위: 7비트 인코딩으로, 128개의 가능한 값을 가집니다 (0부터 127까지).
구성: 대문자와 소문자 알파벳, 숫자, 일부 특수문자 및 제어 문자를 포함합니다.
제한: ASCII는 오직 영어와 일부 기본적인 기호만을 표현할 수 있어 다른 언어나 특수문자에는 적합하지 않습니다.
ASCII는 처음에는 미국에서만 사용하기 위해 만들어졌지만, 컴퓨터 통신의 표준이 되면서 전 세계적으로 널리 퍼졌고 문제가 생겼는데...
다양한 언어와 기호를 표현하기 위해서는 더 많은 문자가 필요했고, 이를 위해 8비트를 사용하는 확장 ASCII 코드가 나오게 되었다.
Extended ASCII
: ASCII에 추가 비트를 사용하여 총 256개의 문자 코드(0-255)를 지원합니다.
: 현재 우리가 사용하는 ASCII
●확장 문자 (128-255)
- 이 범위는 다양한 악센트가 있는 문자, 그리스 문자, 상징, 그래픽 특수 문자 등을 포함하여 추가 문자를 지원합니다.
- 예를 들어, ISO 8859-1 (Latin-1)은 서유럽 언어에 악센트가 있는 문자를 포함합니다.
- 확장 ASCII는 또한 일부 특수 기호, 드로잉 문자 및 기타 특정 용도의 문자를 제공합니다.
영어 의외의 언어를 128개의 여유 공간을 만들어서 이 문제를 해결하였다! 근데 얘는 위처럼 하나의 표로 만들 수가 없다. 왜냐면 각자 나라에 맞는 표준으로 각자 만들어서 사용했기 때문이다. 이때 사용되는 게 Code Page 이다.
Code Page란 여러 가지 언어 표준을 숫자로 표현한 것이다. 한국의 경우에는 CP949와 EUC-KR을 사용한다.
(중요하진 않으니 넘어가겠다.)
하지만 이러한 다양한 코드 페이지 시스템은 국제적인 텍스트 교환에서의 혼란을 야기할 수 있었다.
- (ex. 한국에서 미국으로 문서를 보냈는데 Code Page가 달라 글자가 다 깨짐)(미국에서 CP949로 인코딩을 안 바꾸면 읽을 수 없음)
따라서 여러 가지 문제를 해결하기 위해현대 컴퓨팅 환경에서는 유니코드가 발명되었다.
유니코드(Unicode)
: 전 세계의 모든 문자 체계를 컴퓨터에서 일관되게 표현하고 사용할 수 있도록 설계된 산업 표준입니다.
쉽게 말해 모든 언어를 매핑해 놓은 표를 뜻한다. 최대 매핑할 수 있는 경우는 UTF-32의 경우 고정 길이이기 때문에 2^32 = 약 43억 개의 문자를 인코딩하는 것이 가능하다.
Code Page가 무엇인지 고민하지 않아도 UTF 인코딩을 하게 되면 언어의 손상 없이 교환할 수 있는 것이다!
그렇게 유니코드만 쓰면서 언어 표준 대통일이 일어나고 끝나면 좋겠지만(...), 공학자들은 효율주의자이기 때문에 인코딩하는 방법도 여러 가지를 정의하였다. 대표적인 UTF를 살펴보겠다.
UTF 인코딩
UTF-8
: 1바이트에서 최대 4바이트까지 사용하여 코드 포인트를 표현할 수 있습니다. UTF-8은 ASCII 코드를 그대로 사용하기 때문에, ASCII 문자는 1바이트만 사용하지만, 그 외의 문자들은 더 많은 바이트를 사용합니다. (가변 길이 바이트)
UTF-16
:문자에 따라 2바이트 또는 4바이트를 사용합니다. 기본 다중언어 평면(BMP)에 속하는 문자들은 2바이트만 사용하고, BMP 밖에 있는 문자들은 4바이트를 사용하는 서로게이트 쌍을 이용합니다. (가변 길이 바이트)
UTF-32
: 모든 문자를 위해 일관되게 4바이트를 사용합니다. (고정 길이 바이트)
영어를 사용하는 서구권의 경우에는 기존 ASCII(1바이트)로 인코딩이 가능했다. 즉 데이터를 많이 사용하지 않아도 됐는데, 다른 언어를 추가한다고 2~4바이트를 쓰자니 용량이 커지는 문제점을 가지게 되었다. 따라서 가변 길이 바이트를 통해 1바이트만 필요할 경우 UTF-8을 통해 1바이트만 사용함으로 데이터의 크기를 줄이는 방식을 취했다. 그래서 영어를 사용할 때는 UTF-8을 사용하는 것이 좋다.
결합 문자, 표어문자가 많은 동아시아 특성상 양이 많아 1바이트로 표현하기 어려워 2바이트를 사용해야 하여 이때는 UTF-16을 사용하는 것이 좋다. 여기서 의문이 하나 들게 되는데, 어차피 가변 길이 바이트로 4바이트 까지 표현할 수 있는데 왜 나눴지라는 생각이 들었고 GPT선생님께 질문을 드려보았다.
짧게 말해 최소 바이트보다 큰 언어 표현 시 일정 비트를 가변 길이 바이트확인을 위해 사용하고 있으므로 효율이 떨어진다는 것이다. 이 정도로 의문을 해결하고 넘어가겠다.
유니코드로 통일된 거면 유니코드만 알면 되는 거 아니야?
불행하게도 아니라서 이 글을 쓰게 되었다. 유니코드라는 좋은 표준이 생겨났지만, 이미 많은 컴퓨터에서 ASCII를 사용하고 있었고 이를 바꾸기에는 어려움이 있었다(응용 프로그램 및 운영체제). 그래서 예전 프로그램을 사용한 경우에 ASCII를 통해 우리에게 전달될 경우 언어가 깨져서 보일 것이다.(유니코드와 동일하지 않거나, 다른 Code Page를 사용)
우리는 인코딩의 이해를 통해 문자가 " 궞귪궸궭궼"(Shift_JIS 인코딩 방식을 CP949 방식)처럼 깨졌을 때 알맞은 언어의 인코딩으로 변환하여 복구를 할 수 있어야 하고, 우리는 호환성을 고려해 유니코드(UTF) 방식을 사용해야 한다.
한 줄 요약
유니코드를 사용하고 영어는 UTF-8, 아시아 언어는 UTF-16 인코딩을 사용하자!
참고 사이트
https://namu.wiki/w/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C#s-5.4
'코딩 공부 > TIL(Today I Learn)' 카테고리의 다른 글
Udemy【한글자막】Unreal Engine 5 C++ 개발자 : 수료 후기 (0) | 2023.11.02 |
---|---|
넥슨 채용 박람회 프로그래머 후기 (1) | 2023.10.15 |
넥슨 채용의 나라 질문 리스트 (0) | 2023.10.11 |
넥슨게임즈 필요역량 및 스킬 (0) | 2023.10.11 |
[직무조사] 스크린 골프 탐방 (1) | 2023.09.20 |