본문 바로가기

[기타]UTF-8 이란?

Kwonriver 2021. 12. 11.
728x90

UTF-8은 유니코드를 위한 가변길이 문자 인코딩 방식 중 하나

Universal Coded Character Set + Transformation Format - 8 -bit 의 약자

 

UTF-8은 유니코드 한 문자를 표현하기 위해 최대 4바이트까지 사용

아스키 문자들은 1바이트만을 사용하며 한글은 3바이트를 사용

4바이트로 표현되는 문자는 기본 다국어 평면 외의 유니코드 문자이며 거의 사용되지 않음

 

아스키 문자는 1 바이트만을 사용하므로 7비트 아스키문자와 동일한 방법으로 표시

다른 문자들은 4바이트까지의 비트 패턴으로 표시

 

1바이트 : 0xxxxxxx 로 표현되며 항상 최상위 비트가 0

2바이트 : 110xxxxx 10xxxxxx 로 표현되며 첫 바이트의 최상위 3비트는 항상 110으로 시작

3바이트 : 1110xxxx 10xxxxxx 10xxxxxx 로 표현되며 첫 바이트의 최상위 4비트는 항상 1110으로 시작

4바이트 : 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 로 표현되며 첫 바이트의 최상위 5비트는 항상 11110으로 시작

 

위에서 보듯이 최상위 1바이트를 제외하고는 모두 10으로 시작하는 것을 볼 수 있음

 

문자를 자르다보면 비트 수에 의해 잘못 잘리게 되어 이상하게 표현될 수 있음

영문/숫자는 1바이트씩 차지하므로 1바이트로 자르면 항상 동일하게 자를 수 있지만 3바이트를 사용하는 한글은 1바이트씩 자르면 의미가 없는 문자가 될 확률이 높음

-> hell world 를 hello \n world 로 나누는 함수를 만든다고 했을 때 발생할 수 있는 문제 ( 안녕 세상 -> 안녕 \n 세상 으로 줄 바꿈 시 )

 

따라서 자르기 전에 각 바이트에 shift 연산자를 통해 확인이 가능함

 

단, 이는 문자열에 해당되며 단순 1문자 (char)에는 적용되지 않음

 

 

if (letter[0] >> 11) {
	// 12비트 이상으로 표현 가능한 유니코드
	len = 3;
} else if (letter[0] >> 7) {
	// 8비트 ~ 11비트로 표현 가능한 유니코드
	len = 2;
} else {
	// 7비트 이하로 표현 가능한 유니코드
	len = 1;
}
728x90