위 글을 읽고 공부한 내용입니다.
유니코드란?
숫자와 글자, 즉 키와 값이 1:1 로 매핑된 형태의 코드입니다.
다시말하자면, 아스키코드로 0x41 = A 로 매핑된 것 처럼, 아스키코드로 표현할 수 없는 문자들을 유니코드라는 이름 아래 전 세계의 모든 문자를 특정 숫자(키)와 1:1 로 매핑한 것입니다.
유니코드 블록
U+ 라는 접두어가 붙어있으면 유니코드 라는 의미입니다. 아스키코드의 0x41은 대문자 A이고, 이를 유니코드표에서 찾으면 U+0041이 됩니다.
UTF-8 , UTF-16
위와 같은 용어를 많이 들어보았습니다. 이는 유니코드를 사용하는 인코딩 방식입니다.
UTF-8
가변 바이트를 사용하기 때문에, 1바이트로 표현이 충분한 A 같은 경우는 0x41 로 표현합니다.
1 바이트는 8비트로 이루어지고 8비트를 반으로 나누어 4비트씩 나누면 4비트는 1에서 16까지 표현이 가능합니다.
따라서 1바이트는 2자리의 HEX 표현으로 바꿀 수 있는 것입니다.
추가적으로 2바이트는 4자리의 HEX 표현으로 바꿀 수 있습니다.
UTF-16
반면 UTF-16는 2바이트로 표현하기 때문에 A가 0x0041 표현됩니다.
UTF-16은 Little-Endian 이냐, Big-Endian 이냐에 따라 0x4100이 될수도, 0x0041 이 될 수도 있습니다.
UTF-8은 유니코드 문자를 1~4 바이트 형태로 가변적으로 인코딩하기 때문에 효율적입니다. 따라서 세계적으로 UTF-8을 많이 사용합니다.
EUC-KR
2바이트로 한글을 표현할 수 있게 만든 방식입니다. 아스키 값은 그대로 1바이트로 표현됩니다.
그러면 왜 EUC-KR 보다 UTF-8이 더 많이 사용되는 것일까요?
검색해본결과 EUC-KR 은 한글에 초점이 맞추어진 인코딩 방법입니다. 다국적 시스템을 구축하기 위해서는 UTF-8 이 유리합니다.
https://okky.kr/questions/148112
UTF-8, EUC-KR의 비교
한번 실제 문자열을 UTF-8 과 EUC-KR 로 인코딩 해보겠습니다.
UTF-8
아래와 같은 문자열이 있습니다.
안abcd녕?
아래 결과는 utf-8 로 저장된 안abcd녕? 이라는 문자열을 16진수로 나타낸 코드입니다.
00000000: ec95 8861 6263 64eb 8595 3f0a
어떻게 위와 같은 값이 나오게 되었을까요?
UTF-8 은 유니코드를 사용하는 인코딩방식입니다. 유니코드는 키와 값이 1:1 로 매칭되는 코드라고 하였고요.
'안' 이라는 문자열은 유니코드에서 어떻게 매칭이 될까요?
위 유니코드 표를 살펴보면 U+C548 로 매칭이됩니다.
위와 같은 유니코드 키를 2진법으로 표현하는 방법이 인코딩 방식이고 이 중 하나가 UTF-8 이 됩니다.
그러면 이제 C548을 2진수로 바꾸어보겠습니다.
16진수: C 5 4 8
2진수: 1100 0101 0100 1000
UTF-8 에서 한글 유니코드 블록은 3바이트로 표현됩니다.
그러면 C548의 이진수 값이 아래의 빨간색 영역에 들어가 아래와 같이 됩니다.
저는 여기서 왜 '1110' , '10' , '10' 사이에 빨간색 값이 들어가는지 이해가 되지 않았습니다.
찾아보니 UTF-8 이 인코딩되는 규칙이 아래와 같다는 것을 알 수 있었고 붉은색 값은 아래 표의 x 값에 매핑되는 것입니다.
일종의 인코딩 규칙으로 받아들이기로 했습니다.
이와 같은 절차로 '안' 이 인코딩 된 것을 확인할 수 있습니다.
그럼이제 'a' 문자열을 인코딩 해보겠습니다.
영어문자열은 한글과 다르게 바로 아스키코드 값을 16진법으로 바꾸어주면 됩니다.
따라서 'a' 97 이므로 0x61 이 됩니다.
마지막으로 '?' 를 인코딩 해보겠습니다.
'?' 는 63 이라는 아스키값을 가지기 떄문에 3F 로 변환이 가능합니다.
'안abcd녕?' 이라는 문자열이 UTF-8 로 인코딩 되면 다음처럼 되는 이유를 아시겠나요?
00000000: ec95 8861 6263 64eb 8595 3f0a
* 참고: 마지막 0a 는 라인피드(Line Feed)를 의미합니다.
* Line Feed : 텍스트에서 다음 행으로 넘어가기 전에 한줄이 끝났음을 표시하기 위해 쓰는 특수문자.
EUC-KR
'안abcd녕?' 을 EUC-KR 로 표현해보겠습니다.
00000000: bec8 6162 6364 b3e7 3f0a
EUC-KR 인코딩에는 UTF 인코딩 처럼 유별난 규칙이 없습니다. 아스키 코드와 같이 그냥 EUC-KR 코드표에 매칭되는 값을 찾으면 됩니다.
EUC-KR 코드표에서 '안'을 찾으면 bec8 로 나오고, '녕'은 b3e7로 매핑되어있습니다.
UTF-8 인코딩 그럼 왜 쓰나요?
인터넷에서는 다양한 언어와 문자를 표현해야하기 때문에 많은 문자를 표현하기 위한 유니코드란 것이 존재하게 되었고, 이 유니코드를 가변 길이 인코딩 방식을 사용해 효율적으로 인코딩 할 수 있는 방식이 UTF-8 입니다.
또한 UTF-8은 ASCII와도 호환성이 있기때문에 ASCII 문자를 사용하는 기존에 시스템에도 쉽게 적용이 가능하였기 때문에 오늘날 널리 쓰이게 되었습니다.
* 근데 문자 인코딩은 왜 하죠?
컴퓨터는 웹 상의 모든 언어를 이해할 수 없기 때문에 컴퓨터가 이해할 수 있도록 인코딩을 한다.
이렇게 인코딩된 값이 디코딩되어 우리가 웹사이트에서 문자를 볼 수 있는 것이다.
참고자료
3. https://m.blog.naver.com/philipousys/130068338677
4. https://okky.kr/questions/148112
'FrontEnd > HTML' 카테고리의 다른 글
메타태그와 오픈 그래프, 트위터 카드 (1) | 2023.05.08 |
---|---|
Stacking Order(쌓임 순서), Stacking Context(쌓임 맥락) (0) | 2023.05.05 |
HTML 공백 처리 방법 (0) | 2023.04.30 |