문자열 인코딩
문자열 인코딩
이란 2진법을 사용하는 컴퓨터가 인간의 언어를 일정한 규칙에 따라 2진수로 변환하는 방식이다.
모든 언어를 같은 규칙으로 표현할 수 있는 ISO에서 지정한 유니코드 방식
이 존재한다.
하지만 모든 개발환경이 유니코드를 동일하게 처리하지 않아 서로 호환되지 않는 유니코드 문자열 인코딩 방식(UTF-8, UTF-16, UTF-32
)중 하나를 택해야 한다.
- 한국에는 유니코드 이전의 독자적인
EUC-KR
인코딩 방식을 사용하는 시스템도 종종 있다.
문자 집합(charset)과 문자열 인코딩
- 문자 집합은 사용할 수 있는 문자들의 집합을 의미한다.(
유니코드, ISO-8859, ASCII 등
)- 문자 인코딩은 문자를 코드로 표현하는 방식을 일컫는다.
유니코드
라는 문자 집합을 표현하는 문자열 인코딩은UTF-8, UTF-16, UTF-32
등이 있다.
# 아스키 코드(ASCII)
아스키 코드는 처음으로 표준을 정립한 문자열 인코딩 방식이다.
대소문자, 아라비아 숫자, 공백 및 특수 문자들로 총 128개의 문자
가 있고 문자 하나를 표현하기 위해 1바이트
를 사용한다.
# EUR-KR(CP949)
한글을 표현하기 위한 문자열 인코딩 방식으로 문자 하나를 표현하기 위해 2바이트
를 사용한다.
아스키 코드 문자를 표현할 땐 1바이트를 사용하므로 아스키 코드와 호환된다.
EUR-KR은 완성형 코드로 모든 글자가 완성된 형태로만 존재한다. 그래서 실제 한글처럼 초성, 중성, 종성을 조합해 문자를 만들 수 없으므로 표현할 수 없는 한글이 일부 존재한다.
# UTF-8
UTF-8은 가장 많이 사용되는 인코딩이며 유니코드의 인코딩 방식 중 하나로 8bit(1byte)로 인코딩하며 문자에 따라 1 ~ 6 바이트까지 사용한다.
- 일반적인 문자는 보통 3바이트 내로 처리되고, 4바이트에는 이모지, 5바이트 등은 고대 문자를 위해 사용된다.
아스키 코드 문자를 표현할 땐 1바이트를 사용하므로 아스키 코드와 호환된다.
JSON은 UTF-8 인코딩만 사용되며, 다른 문자열 인코딩은 표준에서 지원하지 않는다.
MySQL의 utf8, utf8mb4
- MySQL에서
utf8
은 3바이트까지 처리하므로 4바이트 영역은 처리하지 못한다.- UTF-8의 완벽한 호환을 위해서는
utf8mb4
를 사용해야 한다.
# UTF-16
UTF-16은 16bit(2byte)로 인코딩하며 문자에 따라 2바이트, 4바이트를 사용한다
2, 4바이트만 사용하므로 아스키 코드와 호환되지 않는다.
# 자바는 UTF-16
- 자바는 인코딩 방식을 UTF-16로 사용한다. 그러므로 하나의
char
는 2바이트를 차지한다. - 유니코드 문자 종류엔
기본 다국어 평면(BMP)
,보충 다국어 평면(SMP)
,상형 문자 보충 평면(SIP)
,특수 목적 보충 평면(SSP)
등이 있는데 UTF-16에서는BMP를 2바이트로 인코딩
하고나머지는 4바이트로 인코딩
한다.- 자바에선
char
를 2바이트로 표현하므로BMP는 char로
표현할 수 있고나머지는 String으로
표현해야 한다.
- 자바에선
- UTF-8이 가장 많이 사용되는 인코딩 방식이므로 자바 기반 웹 서비스는 내부적으로 UTF-16을 사용하되, 외부 통신시에는 UTF-8을 사용하는게 좋다.
# UTF-32
UTF-32는 32bit(4byte)를 고정적으로 사용하여 인코딩한다.
- 꼭 필요한 환경이 아니라면 사용되지 않는다.
# 문자열 길이와 바이트
실제 문자열 길이와 해당 문자에 할당된 문자열 인코딩에 따라 버퍼크기는 다를 수 있다.
- EUR-KR 인코딩 방식에서
안녕하세요
의 문자열 길이는 5, 사용된 바이트는 10이다. - 하지만
Hello
의 문자열 길이는 5, 사용된 바이트는 5이다. - 그러므로 개발 환경에서 문자열을 바이트 단위로 취급해야 한다면 인코딩 방식을 반드시 파악해야 한다.