I. 문자열 인코딩 방식
1. ASCII
•
배경: 1960년대에 시작된 ASCII는 원래 통신 표준을 위해 개발되었습니다.
•
원리: 1Byte 내에서 문자를 표현하기 위해 문자에 7 비트를, 나머지 1 비트는 체크섬을 위해 사용합니다. 이로써 총 128개의 문자를 표현할 수 있게 됩니다.
•
제한: ASCII는 주로 영어 문자 표현을 목적으로 설계되었기 때문에, 다른 언어로는 부정확한 표현이나 표기 문제가 발생하기 쉽습니다.
2. Unicode
•
ASCII의 표현 범위의 한계를 극복하기 위해 모든 언어와 문자를 고유하게 표현할 수 있는 Unicode가 개발되었습니다.
3. UCS(Universal Character Set)
•
특징: Unicode의 고정형 인코딩 방식입니다.
•
UCS-2: UTF-16의 전신으로, 오직 2바이트만을 사용하여 문자를 표현합니다.
•
UCS-4: 2바이트만의 표현 범위로는 부족한 경우에 사용되며, 4바이트로 확장하여 이모지를 포함한 다양한 문자를 표현합니다.
4. UTF(UCS Transformation Format)
•
특징: Unicode의 가변형 인코딩 방식입니다.
•
UTF-8: 기본적으로 1바이트를 시작으로, 문자의 특성에 따라 필요한 바이트 수를 조절합니다. ASCII와의 호환성이 뛰어나 웹에서 주로 사용됩니다. 2바이트 이상으로 문자를 표현할 때 헤더 정보가 추가되므로, 다른 인코딩 방식에 비해 더 많은 바이트가 필요한 경우가 있습니다. 더불어 헤더를 처리하는 추가적인 변환 작업이 필요합니다.
•
UTF-16: 기본적으로 2바이트를 사용하지만, 필요에 따라 길이를 늘려서 다양한 문자를 표현하는 유연성을 가지고 있습니다. 한국어를 포함하여 자주 사용되는 언어를 기본 길이인 2byte 내에서 표현할 수 있습니다. UTF-16의 기본 바이트 구조 때문에 1바이트로도 표현이 가능한 알파벳을 2바이트로 표현합니다.
II. 프로그래밍 언어별 인코딩 표준
1. Python3 인코딩 표준
Python3는 사용된 문자열 기반으로 적절한 고정형 인코딩 방식을 선택합니다. 만약 모든 문자열이 1byte로 표현 가능한 알파벳이라면 Latin-1을 채택합니다. 반면 한국어와 같이 2byte 이상으로 표현할 수 있는 문자가 사용되었다면 UCS-2 방식을 사용합니다. 그 외 4byte로 표현해야 할 문자가 존재한다면 UCS-4가 활용됩니다.
2. JVM 인코딩 표준
JVM은 UTF-16을 채택하고 있습니다. UTF-8을 선택하지 않은 이유는 다양한 문자 표현에 있어 메모리 사용이 크며, 추가적인 변환 작업이 필요하기 때문입니다. 예를 들어, 한국어와 같은 언어에서는 UTF-16을 사용하면 2바이트만으로도 충분하지만, UTF-8을 사용할 경우 바이트 마다 헤더가 추가되어 총 3바이트가 필요하게 됩니다. 이러한 헤더 정보의 추가와 제거로 인한 변환 작업은 비영어권 국가에서 불필요한 컴퓨팅 자원을 낭비하게 만듭니다.
참고
•
Python3 인코딩 표준, 박상길, 파이썬 알고리즘 인터뷰(문자열 다루기 파트)