상세 컨텐츠

본문 제목

UTF-8

Study/Computer Science

by 2 Mir 2021. 12. 21. 22:17

본문

1학년 때 컴퓨터 개론에서 아스키 코드(ASCII-code), 유니 코드(Uni-code)에 대한 내용을 살짝 스쳐간 기억이 있다. 둘 다 숫자로 문자를 표현하는 방식인데, 간단히 짚고 넘어가자면

 


아스키 코드

- 128개(7비트)의 문자를 사용
- C언어의 char는 1바이트인데? => 남은 1비트는 통신 에러 검출을 위한 패리티 비트(Parity Bit)
- 영어만 존재 => ASCII의 A가 American임

유니 코드
- 전 세계 문자를 표현하기 위해 국제 표준 코드 등장
- 처음에는 2바이트(65,536)에 모두 담을 수 있다고 생각했지만, 어림도 없었음
- 계속 업데이트 중(14.0 버전이 지난 9월 22일에 나왔다고 함)
- UTF-8, UTF-16, UTF-32 등 다양한 인코딩 방식이 존재

 

이 중 개발할 때 가장 많이 쓰이는 방식인 UTF-8에 대해 정리하고자 한다.

 

UTF-8, 왜 이렇게 많이 쓰일까?

UTF-8의 가장 큰 장점은 모든 유니코드 문자를 표현할 수 있다는 점이다.

그 이유는 4바이트(4,294,967,296)까지 사용하기 때문인데, 여기서 문제가 발생한다.

모든 언어를 4바이트로 표현하게 되면 낭비가 심해지기 때문이다.

그래서 UTF-8은 가변 길이 인코딩 방식을 채택해 1바이트부터 4바이트까지 사용할 수 있게 만들어졌다.

한 문자가 몇 바이트인지는 상위 비트에 다음과 같은 규칙을 만들어 알 수 있게 하였다.


UTF-8 규칙

- 0으로 시작 => 1바이트
- 110으로 시작 => 2바이트
- 1110으로 시작 => 3바이트
...
- 2바이트 이상의 문자에서, 첫 바이트가 아닌 나머지 바이트들은 상위 2비트가 항상 10

출처: Wiki 백과

 

UTF-8의 또다른 장점은 아스키 코드의 슈퍼셋(Superset)이면서, 다른 유니코드 인코딩으로 변환하는 데 용이하다는 점이 있다. 그리고 위처럼 규칙이 있기 때문에 간단하게 UTF-8로 만들어진 문자열이라는 것을 확인할 수 있다고 한다.

 

규칙 때문에 낭비가 생길 수 있지 않을까?

잠깐 다른 인코딩과 비교하자면 UTF-16은 2바이트 고정 길이 인코딩 방식을 사용하는데, 한중일 문자의 경우 UTF-8에서는 이보다 1바이트 많은 3바이트로 표현한다. 다만 UTF-16은 아스키 코드에 해당하는 영역 또한 2바이트로 표현하기 때문에 어떤 게 낫다고 효율을 따지기 힘들다.

 

개발하다가 UTF-8과 마주하는 곳

@charset "UTF-8";

CSS를 개발하다가 이런 선언이 파일 최상단에 적혀있는 것을 본 적이 있는데, 이는 이 파일이 UTF-8로 적혔음을 명시하는 정도가 되겠다. 옛날에는 <link rel='stylesheet' charset='utf-8'> 로도 적었다고 하는데, 이 방식은 더이상 쓰이지 않는다고 한다.

 

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javaScript" src="thinkThing.js" charset="utf-8"></script>

요새는 React, Next가 많이 쓰여서 쌩 HTML은 볼 일이 많이 없지만, HTML에서 상단에 meta 태그를 작성하거나 script 태그를 사용할 때 인코딩 방식을 지정할 수도 있다.

 

UTF-8은 Mysql의 character set에서도 볼 수 있다.

 

한가지 무시무시한 점은 기본적으로 latin1으로 설정되어있을 수 있는데, latin1은 라틴어 포함 영어 기반의 언어들을 표기하는 방식으로 한글을 지원하지 않기 때문에 이를 그대로 사용하게 되면 DB에 한글 데이터를 저장할 수 없는 상황이 발생한다.

 

사실 이 글은 이 이야기를 하려고 적은 것인데, 실제로 프로젝트에서 Github OAuth를 이용해 로그인을 구현한 적이 있었다. 모든 사용자도 아니고 특정 사용자만 로그인이 안되는 상황이 생겨서 원인을 분석하던 중 Github 이름이 한글인 사람만 오류가 발생하는 점을 발견했고, DB의 character set을 출력해보니 역시나 latin1으로 되어있었다. 이를 UTF-8로 잘 바꾸니까 정상 작동하는 것을 볼 수 있었다.

 

'Study > Computer Science' 카테고리의 다른 글

PNG vs JPG(JPEG)  (0) 2021.12.14

관련글 더보기

댓글 영역