컴퓨터가 문자를 이해하기 위해 숫자로 변환되어 저장하는 방식에서 어떤 기준으로 저장하고 이해하는 것일까요?
문자를 코드로 변환하는 방식을 ‘문자 인코딩’이라고 하고,
거꾸로 코드를 문자로 변환하는 것을 ‘문자 디코딩’ 이라고 합니다.
간단히 말해서, 문자를 인코딩해서 숫자로 변환해서 저장하고,
문자를 읽을 때는 숫자를 디코딩해서 원래의 문자로 변환해서 읽는 것입니다.
가끔씩 인터넷을 하다가 막 이상한 글씨로 뜨는 케이스는
대부분 웹페이지에 인코딩 정보가 포함되어 있어서 웹브라우저에서
올바르게 디코딩이 되는데, 서로 인코딩 방식이 다르게 설정되어있으면, 깨져서 보일 수 있습니다.
1> 인코딩 (Encoding)
- 부호화하는 개념으로 문자자 기호들을 컴퓨터에 저장하거나 통신에 사용하기 위해 부호화 하는 방법입니다.
(복호화는 반대로 본래의 문자나 기호를 나타내는 문자코드가 된다.)
해당 인코딩을 수행하는 역할을 인코더라고 합니다.
- 인코딩 방식에는 ‘Character Set’, 문자 인코딩 형태, 문자 인코딩 구조가 있습니다.
a. 문자집합 : 정보를 표현하는 글자 집합으로, ASCII 코드와 유니코드가 있습니다.
b. 문자 인코딩 형태 : 대표적인 UTF-8 같이, 유니코드를 8비트의 숫자 집합으로 나타냅니다.
2> 디코딩 (Decoding)
인코딩의 반대로 복호화라고 합니다. 인코딩 (부호화) 된 정보를 부호화하기 전으로 되돌리는 처리 방식입니다.
해당 역할을 하는 것으로 디코더라고 합니다.
3> 아스키 코드
영문 알파벳을 사용하는 대표적 문자 인코딩입니다.
128개의 문자 집합을 제공하는 7bit 부호이며,
영문 대·소문자, 0~9, 특수기호('?', '/`, `?`, `=`, ……) 등 총 128(27)개의 서로 다른 문자를 표현할 수 있습니다..
0x00 ~ 0x7F : 총 127개 문자(대소문자 , 숫자, 제어문자, 특수문자)
< 예시 >
0x41 = ‘A’
4> 유니 코드
모든 문자를 하나의 통일된 문자집합(Character set)으로 표현하기 위해 만든 코드라고 합니다.
즉, 코드와 문자가 1:1로 매핑된 형태의 코드입니다.
(ex)
아스키코드 0x41 = 'A' = U+0041 유니코드
https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_0000~0FFF
유니코드 인코딩에는 UTF-8, UTF-16, UTF-32 등 여러가지 종류가 있고,
자주 사용되는 UTF-8은 하나의 문자를 1~4 byte의 가변크기로 표현하고,
UTF-16은 모든 문자를 2byte 고정크기로 표한합니다.
‘A’ 라는 문자를 UTF-8을 사용하면 ‘0x41’로 표현하고, UTF-16을 사용하면 ‘0x0041’로 표현됩니다.
(UTF-32는 ‘0x00000041’)
(ex)
아스키코드 0x41 = 'A' = U+0041 유니코드
UTF-16은 모든 문자의 크기가 동일하게 표현되지만, 1 byte로 표현되는 영어, 숫자가 2 byte 고정크기로 표현되어 용량이 커지는 단점이 있습니다.
UTF-8은 가변크기이므로 한글은 3byte, 영어,숫자는 1byte 로 표현되어 용량의 차이는 없지만, 문자 크기가 달라서 다루기 어려운 점이 있습니다.
인터넷에서는 전송속도가 중요해 문서의 크기가 작을수록 유리하므로, UTF-8 방식이 유리하다고 합니다.
5> EUC-KR
한글 인코딩 방식 중 하나로 UTF-8과 EUC-KR 방식이 있습니다.
8bit 문자 인코딩의 대표적인 한글 인코딩으로 보통 ‘완성형’으로 불린다고 합니다.
한글은 2byte로 사용하는데 주로 한글을 사용하는 곳에서만 적합하다고 합니다.
- 웹에서는 EUC-KR 끼리 UTF-8끼리만 인코딩 변환 가능.
- 웹에서 기본 UTF-8을 사용하므로 한글 사이트 제작 시, 인코딩을 EUC-KR로 설정해야함.
6> UTF-8
대표적인 유니코드 인코딩 방식으로 가변길이 문자를 인코딩하며, 대부분의 ASCII 문자들을 표현할 수 있습니다.
대부분의 웹서버, OS, 프로그래밍이 기본적으로 UTF-8을 이용하여 대부분 소스들을 UTF-8 방식으로 인코딩하고 있습니다.
따라서 UTF-8이 한글을 3바이트로 표현하는 것으로 보아, 한글로 된 문서들을 표현하기에는 UTF-8이 데이터의 크기에서 이점을 가져갈 수 있는 인코딩 방식이다.
하지만 대부분의 컴퓨터 환경들은 영어로 구축되어 있기에 영어를 1바이트로 표현할 수 있는 UTF-8이 거의 표준처럼 사용되고 있는 추세이다.
UTF 버전이 다른 방식이 나온 이유는
UTF-8 인코딩 방식으로 사전적인 모든 문자들은 표시할 수 있었지만, 한자나 고어, 이모티콘 등 다양한 문자를 표현하기 위해 2byte 단위의 UTF-16이 등장하였고, 더 확장하여 4byte 단위의 인코딩 방식 UTF-32가 등장하였다고 합니다.
그래서 데이터의 크기가 중요한 곳에는 UTF-8이 사용되고, 다양한 문자를 표현하기에는 UTF-16과 UTF-32가 더 유용하므로 처리하는 데이터의 종류에 따라서 사용하는 시스템에 따라서 적절한 인코딩 방식을 사용해야한다.
프로그래밍에서의 인코딩, 디코딩 방식을 보면,
DB에서 어떤 데이터를 조회해서 클래스의 문자열 변수에 데이터를 할당하면, Java 소스 파일의 인코딩 타입을 따라 갑니다.
1> DB에서 “사람” -> 4 byte (EUC-KR)
2> Java VO 변수에 할당 “사람” -> 6 byte (UTF-8)
3> Java VO 변수를 전문으로 변환 “사람” -> 4 byte (전문은 EUC-KR)
String st = “사람”;
St.length(); // 글자수 리턴으로 2
St.getBytes().length; // 변수의 byte 길이, Java 소스의 인코딩 타입 반환 6
St.getBytes(“EUC-KR”).length(); // 문자열을 EUC-KR 인코딩하여 바이트 길이 반환 4
* BASE64 인코딩 관련해서는 아래 글 참고하시기 바랍니다!!
'IT ▶ > Java & Web' 카테고리의 다른 글
[자바 조건문] Java SWITCH문 사용 방법 (0) | 2019.11.12 |
---|---|
암호화에서 BASE 64 인코딩이란? (2) | 2019.10.22 |
[Java] String 문자열 자르기, 치환하기 – substring, replace 함수 사용 (0) | 2019.10.08 |
[Java] Random() 클래스, String 문자열 합치기(concat, append, +) 사용 방법 (0) | 2019.09.30 |
[Java] "".equals() 와 '==' 으로 Null 값 체크방식 차이 정리 (2) | 2019.07.26 |