문자열 인코딩 개념 정리

JINSUNG LEE·2021년 9월 9일
0
post-thumbnail



우리가 평상시 컴퓨터, 휴대폰 등등 전자 매개체로 문자를 입력할때 전자제품들은 문자들을

어떻게 인식하고 있을까?

이진법
두개의 숫자 1과 0으로 이루어진 체계 문법

이는 이진법(binary number) 수학적으로 접근하여 0110110 이러한 형태로 출력된다.

각 문자를 지정하여 이진법 숫자를 대입하였으며 이를 인코딩이라고 부른다.

인코딩
사람이 인지할 수 있는 형태의 데이터를 약속된 규칙에 의해 컴퓨터가 사용하는 0과 1로 변환하는 과정

예시)

문자ABC
이진법 표기10110

(위의 표는 단순 예시)

문자와 숫자를 대칭하여 사용하기 위해 조건을 종합하여 정리한게 바로 문자표가 된다.

전자제품을 만드는 회사들이 서로 문자표를 정립하는데 A 전자제품은 H 알파벳을 010으로 정립하고

B 전자제품은 110이라고 정립하여 제품마다 상이하게 문자 표기를 기준잡아

문자표은 그야말로 아비규환이 되버렸다.

이를 해결하고자 모두가 문자표를 일관하게 사용하도록 표준을 정한 것이 바로 아스키 코드(Ascill code)이다.



ASCII CODE

알파벳과 특수문자 및 공백을 종합하여 총 128개로 이루어진 문자들을 7Bit 인코딩으로 표현할 수 있다.

그런데 아스키 코드 ascii의 정식 명칭은 도대체 무슨 뜻일까?

American Standard Code for Information Interchange 미국정보교환표준부호이다.

잠깐만 미국..? 미국 🗽 🇺🇸 ?

우리가 mm, cm, m, km 단위 쓸때 inch, feet, yard, mile로 단위 혼란을 주는 나라잖아!!



					우리가 만들었으니 오로직 Alphabet 영어를 기준으로 잡은거임. 






아니 그럼 알파벳이 아닌 다른 글자를 쓰는...

						🇯🇵 私たちは??? 🇰🇷 우리는???  🇷🇺 мы???



인터넷 웹 발전으로 전세계 지구촌이 가깝게 형성되는 시점에 다른 나라 문자를 종합하여

표기된 문자표는 절대적으로 필요하다.

각 나라의 문자표 표준을 새로 종합하여 탄생한 것이 바로 유니코드(Unicode)이다.



Unicode

유니코드 협회에서 주관하여 전 세계 모든 문자를 체계적으로 종합 후 문자표를 확립하게 되었다.

유니코드가 탄생하기 전에는 제 아무리 같은 한글 파일이 이루어진 텍스트 파일이라도

표기법 기준을 표준으로 지정하지 않았다.

문자간의 인코딩이 오류가 발생되어 위의 사진과 같은 뷃봸굾을 보았던 것이다.



막상 유니코드를 사용해보니 영어는 1byte, 한글은 3byte로 가변되어 또 다른 문제점을 발견하게 된다.

컴퓨터가 문자를 정리할때마다 1byte, 2byte, 3byte 제 각각 분별하다 보니 혼란을 주는 것이다.

								그만,, 고문시켜라.. 휴먼

이를 해결하기 위해 문자표에 각 byte마다 인코딩 표시를 주어 이를 UTF-8, UTF-16 이라고 부른다.



UTF-8, UTF-16

UTF-8은 유니코드 한 문자를 작성할 경우 1byte(= 8bit)에서 4byte까지 사용된다.

사실 UTF-8과 UTF-16에 대해 제대로 알기 위해선 byte와 이진법에 관해 자세히 알고 있어야 한다.

이를 Javascript 메서드를 활용하여 어떤 특징이 있는지 알아보자

code 라는 문자를 UTF-8로 변환해보자.


let encoder = new TextEncoder;

encoder.encode("code") // [99, 111, 100, 101]

TextEncoder() 메서드는 해당 문자열을 10진법으로 나열하는데

[99, 111, 100, 101] 라는 값이 도출되었다.

앞서 컴퓨터는 2진법으로만 문자열을 해석할 수 있다고 했으니 이제 10진법을 2진법으로 변환해보자


(99).toString(2)  // '1100011'
(111).toString(2) // '1101111'
(100).toString(2) // '1100100'
(101).toString(2) //'1100101'

영어 알파벳은 각 7bit가 인식하여 합계 28bit를 계산하면 3.5byte 인가..? 정답은 아니다.

7bit인 이유는 사실 8bit이지만 첫번째 자리는 오류 판별용으로 활용하기 위해 7bit로 맞춘

ASCII CODE 해석 방법이므로 8bit로 읽는게 맞다.

한 글자 기준으로 한글은 24bit로 인식되어 3byte,

이모지는 특수 문자인 관계로 32bit로 인식되어 4byte로 계산된다.

UTF-16은 1~9 , 숫자 10부터는 A~F 체계로 가변하는데 한글은 여기서 2byte로 계산된다.



결국 문자간 인코딩을 통해 오류가 발생되었던 이유는 UTF-8을 UTF-16으로 표현 혹은

정반대로 표현했기에 오류가 발생한 것이다.

그럼 이제 UTF-8이랑 UTF-16 구별만 잘하면 인코딩으로 인한 문제는 없겠네..?

									ok👌 끝.. 땡큐 👍 !! 

에낏 이 사람아!! 우리가 익숙하게 보았던 글자 깨짐에 있어 더 큰 문제는 사실 다른 녀석 때문이였다.

					상대는 EUC-KR이다.. 얼른 일어서라 너는 조선의 프로그래머야!!

바로 EUC-KR이다.



EUC-KR

EUC-KR
EUC는 Extend unix code의 약자로 영어를 제외하고 문자를 표현하기 위한 확장부호를 의미.
EUC-KR은 한글 표현을 위한 문자 인코딩 방식이며 한 글자 기준으로 2byte로 처리.

유니코드가 등장하기 전 한글 문자 인코딩은 EUC-KR를 활용하였으며,

이는 Windows 개발사 마이크로오피스가 EUC-KR 채택하였다.

대한민국 컴퓨터 사용자들 대부분은 Windows 운영체제를 사용하며

필자는 7차 교육 과정 출신으로 컴퓨터를 Windows로 배웠다.

							7차 교육 과정 당시 익숙한 컴퓨터실 풍경

인터넷 웹은 주로 UTF-8 인코딩을 표준으로 활용하는데 Windows의 EUC-KR 인코딩과 관계가

상이하므로 당연히 글자가 깨질 수 밖에 없는 셈이였던 것이다.




결론

  1. 문자열은 숫자 2진법으로 전자기기에 표현됨
  2. 2진법으로 인식하는 이 과정을 인코딩
  3. 미국은 ASCII CODE로 문자표를 정립하여 활용
  4. 웹의 발달로 인해 각 국 언어 글자가 다른 관계로 유니코드라는 국제화 표준 문자표 확립
  5. 웹 인코딩을 UTF-8, UTF-16으로 나누며 겹칠 경우 글자 깨짐 발생
  6. 한국에서 익숙하게 겪은 글자 깨짐은 위 사실보다는 Windows가 채택한 EUC-KR 인코딩으로 인해 글자깨짐
profile
https://californialuv.github.io/Tech_Blog 이사 갔어용 🌎 🚀

0개의 댓글