문자열 인코딩

작성일: 2021-08-15 11:45

문자열 인코딩이란 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이다.
  • 그러므로 개발 환경에서 문자열을 바이트 단위로 취급해야 한다면 인코딩 방식을 반드시 파악해야 한다.