0.
앱에서 서버로 데이터 전송 시, 데이터 마다 약속한 인코딩과 인코딩에 따른 길이 제한이 쓰이고 있었다. 운영하고 있는 앱에서 중계서버 1개로 데이터를 보내지만, 중계서버에서 다시 여러 실 고객사 서버로 데이터를 전송한다. 실 고객사마다 인코딩 방식이 다르기 때문에, 앱에서 중계서버 전송 시, 인코딩과 인코딩에 따른 길이 제한을 맞춰주는 것이 중요하였다.
그 외에도 인코딩 개념은 중요하다고 생각되었다. '서버에서 통신 할 때 데이터가 깨지면 안 되니까!' 등의 이유로~
이 기회에 인코딩 개념을 한번 정리해놓는 게 좋을 것 같아 해당 포스팅을 쓰게 되었다.
1. 인코딩, Encoding
사람이 인지할 수 있는 형태의 데이터를 약속된 규칙에 의해 컴퓨터가 사용하는 0과 1로 변환하는 과정
- 나무 위키
2. 문자코드
(컴퓨터가 사용하는 0과 1로) 변환할 때의 기준 = 문자코드
ASCII 코드
- 7비트 부호체계
- 000(0X00)부터 127(0X7 F)까지 총 128개의 문자 집합 제공
- 일반적으로 데이터는 byte 단위로 다뤄지는데, ASCII는 1byte를 구성하는 8bit 중에서 7bit 만 사용
- 나머지 1bit는 통신 에러 검출을 위해 사용(Parity bit) - 현재는 더 이상 사용 X
- 장점: 매우 단순, 간단 -> 어느 시스템에서도 적용 가능
- 단점: 2byte 이상의 코드를 표현할 수 없다. <- why?
확장 ASCII
- ASCII에서 1byte를 구성하는 8bit 중 1bit를 활용해서 추가로 문자를 정의한 것
- 추가된 128개 문자는 여러 국가와 기업에서 필요에 따라 서로 다르게 정의하여 사용
- 예
- ISO 8859-1 (ISO Latin 1)
- 국제표준화기구에서 정의한 확장 ASCII
- 서유럽에서 일반적으로 사용하는 문자들을 포함
- CP949
- 마이크로소프트에서 정의한 한글 문자 집합
- EUC-KR에서 지원되는 한글 2350자 외에 나머지 8822자가 추가
- Win95 한글판에 탑재되어 배포됨
- ISO 8859-1 (ISO Latin 1)
유니코드
- 모든 문자 체계를 하나의 문자 집합으로 만든 것. <- 서로 다른 언어를 사용하는 컴퓨터들이 문제없이 통신하도록!
- 숫자와 글자, 즉 키와 값이 1:1로 매핑된 형태의 코드
- ASCII코드로 표현할 수 없는 문자들, 전 세계 모든 문자를 특정 숫자(키)와 1:1로 매핑
- 한글의 경우) 조합형을 위한 자모, 완성형을 위한 한글 모두 포함
- 조합형: 초성, 중성, 종성으로 구분하여 문자 작성
- 완성형: 문자를 하나의 완성되어져 있는 글자로 인식
- character set: 포함시키고자 하는 문자 집합을 정의 = UTF(Unicode Transformation Format)
EUC-KR 코드
3. 인코딩 방식
(컴퓨터가 사용하는 0과 1로) 변환하는 방식
유니코드를 사용하는 인코딩 방식
UTF-16
- 모든 문자를 2byte의 고정 길이로 표현
- UTF-8과 마찬가지로 ACII코드의 128개 문자 집합(character set)에 대해 호환성을 가짐.
- 바이트 순서가 정해지지 않아 리틀/빅 엔디안 문제가 발생하기 때문에 인터넷 상에서의 사용을 권고하지 않음.
- 예) A = 0x4100(Little-Endian)이나 0x0041(Big-Endian)으로 표현 (2byte)
- ASCII 코드표를 보면, A는 0x41 이다. 이것을 유니코드표에서 찾으면 U+0041이 된다.
- UTF-16은 고정크기이므로, 바이트 순서(Byte ordering)에 따라 위와 같이 표현된다.
UTF-32
- 모든 문자를 4byte의 고정 길이로 표현
- 예) A = 0x4100 0000(Little-Endian)이나 0x0000 0041(Big-Endian)으로 표현 (4byte)
- ASCII 코드표를 보면, A는 0x41 이다. 이것을 유니코드표에서 찾으면 U+0041이 된다.
- UTF-32은 고정크기이므로, 바이트 순서(Byte ordering)에 따라 위와 같이 표현된다.
바이트 순서(Byte Ordering), 리틀 엔디안(Little-Endian), 빅 엔디안(Big-Endian)을 모르겠다면...?
https://gaeng-stroy.tistory.com/164
UTF-8
- 하나의 문자를 1~4byte의 가변 길이로 표현(한글=3byte, 공백/영문=1byte)
- 1byte 영역은 ASCII코드와 하위 호환되며 ASCII코드의 128개 문자 집합(character set)은 UTF-8과 동일하게 호환
- 조합형 방식의 charater set
- 사용빈도가 높은 글자=적은 저장 공간, 사용 빈도가 낮은 글자=많은 저장 공간
- 현재 인터넷에서 가장 많이 쓰이는 인코딩이며 뛰어난 크로스 플랫폼 호환성을 가짐.
- 예) A = 0x41로 표현 (1byte)
- ASCII 코드표를 보면, A는 0x41 이다. 이것을 유니코드표에서 찾으면 U+0041이 된다.
- 1byte로 표현 할 수 있기 때문에 UTF-8 인코딩 방식에서 위와 같이 표현된다.
EUC-KR 코드표를 사용하는 인코딩 방식
EUC-KR
- EUC-KR 코드표를 사용하는 인코딩 방식
- 한글을 2byte로 변환
- 완성형 방식의 charater set
- 한글 표현이 문자표에 없는 경우도 있다.
- 한글, 숫자, 특수기호, 영문, 한문 일어 포함. 이 외에 다른 문자를 사용하는 나라의 언어는 인코딩 X
휴... 쓰다보니 너무 길다... 나머진 다음 포스팅에...
.참고
blog.naver.com/PostView.nhn?blogId=bbmobile&logNo=221360230141
반응형
'Platform > BackEnd' 카테고리의 다른 글
[javascript] 구글스프레드시트에서 읽어오기-(0) (0) | 2021.08.02 |
---|---|
[Byte Ordering] 바이트 순서 (0) | 2020.10.14 |
[] multipart/form-data (0) | 2020.08.10 |
[javascript] 실무에서 자주 쓰는 array 함수 (0) | 2019.11.16 |
[Spring] maven 없이 Spring 프로젝트 생성(eclipse, mybatis, oracleDB 등) (0) | 2019.11.12 |