21 03 13 문자열 인코딩
문자열 인코딩(Character encoding) 이란.
2진법을 사용하는 컴퓨터가 인간의 언어를 일정한 규칙에 따라 2진수로 변환하는 방식
- 아스키 코드
- EUR-KR
- UTF-8, 16, 32
문자열 인코딩 방식에서 여러 규칙 중 어느 것을 적용 하는지에 따라
글자가 올바르게 표현 될 수도 있고 깨져서 보일 수도 있다.
깨지는 이유는??
컴퓨터 인코딩의 역사
처음 컴퓨터가 등장 할때는 영어, 특수문자만 지원 해주었다고 한다.
그러면서 여러 나라로 컴퓨터가 전파되면서 국가별로 사용하는 언어를 표현하고자
독자적인 규칙을 만들었다고 한다.
그리고 모든 언어를 같은 규칙으로 표현할 수 있는 유니코드 방식이 등장했지만
모든 개발환경이 유니코드를 동일하게 처리하지 않아,
개발자는 서로 호환되지 않는 유니코드 문자열 인코딩 방식(UTF-8, 16, 32) 중 하나를 택해야 합니다.
그리고 한국에는 유니코드가 등장하기 전 만든 인코딩 방식(EUC-KR)을 쓰는 오래된 시스템도 있습니다.
아스키 코드(ASCII)
아스키 코드 (American Standard Code for Information Interchange)
- 처음으로 표준을 정립한 문자열 인코딩 방식으로 아직까지 많이 사용
- 대,소문자 아라비아 숫자, 공백 및 특수 문자가 있음
- 0~127 까지 총 128개 숫자 사용
- 문자하나를 표현하기위해 1 Byte 사용
- 영어를 제외한 다른 언어를 표현 할 수 없다.
EUR-KR
EUC-KR은 한국 산업 표준으로 지정된 한국어 문자 집합
- 한글 하나를 표현하기 위해 2 Byte 사용
- 아스키 코드는 1Byte 사용하기에 아스키 코드와 호환 가능
- 빈곳을 포함해서 가로로 총 16개의 문자
- 가장 왼쪽에 있는 코드(B0A0, B0B0)을 기준으로 오른쪽으로 한칸 이동시 1바이트씩 더함
- 예를 들어 ‘가’를 표현하면 B0A1로 표현하고, B0A1는 0xB0,0xA1로 나뉘어 2바이트가 사용됨
- 완성형 코드이기 때문에 표현할 수 없는 한글 글자가 있음
- 실제 보여지는 문자열 길이와 컴퓨터가 할당하는 버퍼의 크기는 다를 수 있다.
유니코드
EUR-KR처럼 국가별로 독자적인 문자 집합과 인코딩 방식은
개발자 업무량 증가될 것이다.
이런 문제를 해결하고자 국제 표준화 기구(ISO)에서 유니코드를 만들었다.
유니코드 문자 집합을 표현하는 문자열 인코딩은 세가지
- UTF-8
- UTF-16
- UTF-32
UTF-8
- UTF-8은 8비트(1Byte)로 인코딩 하는 것을 의미
- 표현하려는 문자에 따라 최소 1Byte ~ 6Byte까지 사용이 가능
- 아스키 코드와 완벽하게 호환
그림에서 ‘바이트 수’ 행의 값은 문자를 표현하는데 총 바이트 크기를 나타내고
1 ~ 6 바이트 까지 있는 1과 0은 고정된 비트 값이며, 사용하는 바이트 수 에 따라 달라집니다.
‘x’ 문자는 유니코드를 저장하는데 사용되는 비트의 영역 입니다.
그림에서 첫번째 줄(1Byte)에서 첫째 비트 값이 0 이므로
0을 제외한 나머지 비트 7개로 문자를 표현합니다.
그래서 0~127까지의 수로 문자를 표현 할 수 있고
아스키 코드와 같은 규칙을 가지므로 UTF-8과 아스키 코드는 완벽하게 호환된다고도 할 수 있습니다.
그리고 보통 일반적인 문자는 3Byte 내로 처리가능
4 Byte 영역은 이모지(에모지)
5 Byte 부터는 고대 문자를 사용하지 않는이상 사용할일이 없습니다.
UTF-16
- UTF-16은 2Byte로 인코딩하는 것을 말함
- 2Byte, 4Byte 만 사용 하기에 아스키 코드와 호환되지 않습니다.
유니코드에는 문자 종류에 따라 4가지로 나뉨
- 기본 다국어 평면(BMP)
- 보충 다국어 평면(SMP)
- 상형 문자 보충 평면(SIP)
- 특수 목적 보충 평면(SSP)
바이트 수는 문자가 어떤 평면에 속하는지에 따라 결정됨
ex) BMP같은경우 U+0000 ~ U+FFFF까지 범위에 속하는 문자가 있는데
이 범위에는 한글, 한자를 포함한 여러 다국어가 있고 2Byte로 인코딩 합니다.
정리하면 UTF-16은 일반 글자는 2Byte,
특별한 글자(쐐기 문자, 키프로스 음절문자 …)는 4Byte를 사용해 인코딩합니다.
정리
UTF - 8
- 오늘날 가장 많이 사용하는 문자열 인코딩
- 최소 1 ~ 6 Byte 사용(대부분 4Byte내로 처리)
- 아스키 코드와 호환 가능
- JSON은 UTF-8 인코딩만 사용함, 다른 문자열은 지원하지않음
- ? 윈도우,자바 임베디드를 제외한 거의 모든환경에서 문자열 처리 표준
UTF - 16
- 자바와 윈도우는 유니코드를 사용하기 전 부터 고정된 2바이트 길이의 문자 집합 사용
- 2 Byte, 4 Byte 길이의 문자열 사용, 때문에 아스키와 호환이 안됨
- UTF - 16기반 환경에서 UTF - 8을 사용할때는 명확한 구분이 필요함 예를들어 자바기반 웹서비스는 UTF - 16을 사용하되, 외부(DB) 통신 시 UTF-8로 변환하여 사용하는걸 추천
UTF - 32
- 반드시 사용해야 하는 환경이 아니라면 권장하지 않음
EUC-KR
- 한국에서 독자적으로 사용하는 문자열 인코딩방식
- 고정된 2Byte 사용
- 가능하다면 UTF-8로 바꾸어 사용하는게 좋지만 현실적으로 어려움이 존재
- 국내에서 만든 서비스 중 EUC-KR을 사용하는 경우가 있을 수 있음.
References.
[학교에서 알려주지 않는 17가지 실무 개발 기술]
https://m.blog.naver.com/bbmobile/221360230141