WEB개념

[Charset] 유니코드(Unicode) / 인코딩 ( ASCII , EUC, UTF..)

wooyeon06 2021. 12. 23. 21:28

 

ASCII코드

  • 7비트 부호체계
  • 000(0X00)부터 127(0X7 F)까지 총 128개의 문자 집합 제공
  • 나머지 1bit는 통신 에러 검출을 위해 사용(Parity bit) - 현재는 더 이상 사용 X
  • 장점: 매우 단순, 간단 -> 어느 시스템에서도 적용 가능
  • 단점: 2byte 이상의 코드를 표현할 수 없다, 일어 중국어등 표현 불가

 

EUC-KR

 한글 지원을 위해 유닉스 계열에서 나온 완성형 코드 조합이다.

완성형 코드란 완성 된 문자 하나하나마다 코드 번호를 부여한 것이다. 

 

 

유니코드

 : 유니코드란, 숫자와 글자, 즉 키와 값이 1:1로 매핑된 형태의 코드 인것이다.

UNICODE는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현할 수 있도록 고안된 코드 조합이다. 여기서 주의해야 할 것이 유니코드는 '인코딩'이 아니라는 것이다. 유니코드는 전세계 거의 모든 문자를

2bytes 숫자로 1:1 매핑 시키는 '방식'을 말하고, 유니코드를 표현하는 여러가지 '인코딩' 방식들이 존재하는 것이다.

 

 

UTF-8(Universal Coded Character Set + Transformation Format – 8-bit)

: 유니코드를 위한 가변 길이 문자 인코딩(멀티바이트) 방식 중 하나로, ANSI의 단점을 보완하기 위해 만들어졌다.

ANSI는 다국어를 지원하기 위해 CodePage 정보를 미리 알고 있어야 한다. UTF-8은 멀티바이트 개념을 사용하여 하나의 Character Set에 거의 모든 문자를 넣었다.

 

멀티바이트란 표현해야 하는 문자에 따라 글자 크기를 가변으로 변경하여 사용하는 것을 말한다.

 

  AASCII - 알파벳  ASCII - 숫자  한글  한자  일어
EUC-KR a =1 바이트
0 : 0x61
1 =1 바이트
0 : 0x31
가 =2 바이트
0 : 0xb0
1 : 0xa1
韓 =2 바이트
0 : 0xf9
1 : 0xdb
あ =2 바이트
0 : 0xaa
1 : 0xa2
UTF-8 a =1 바이트
0 : 0x61
1 =1 바이트
0 : 0x31
가 =3 바이트
0 : 0xea
1 : 0xb0
2 : 0x80
韓 =3 바이트
0 : 0xe9
1 : 0x9f
2 : 0x93
あ =3 바이트
0 : 0xe3
1 : 0x81
2 : 0x82

 

 

 

UTF-8  vs UTF-16

인코딩 방식:
UTF-8은 가변 길이 인코딩 방식입니다. 각 유니코드 문자를 1바이트부터 최대 4바이트까지 가변 길이로 인코딩합니다. 문자의 유니코드 코드 포인트에 따라 바이트 수가 다릅니다.

UTF-16은 고정 길이 인코딩 방식입니다. 모든 문자를 2바이트로 인코딩합니다. 기본적으로는 BMP(Basic Multilingual Plane)에 있는 문자는 2바이트로 표현되지만, Supplementary Plane에 있는 문자는 4바이트로 표현될 수 있습니다

메모리 공간:
UTF-8은 대부분의 영문 텍스트에 대해 UTF-16보다 더 적은 메모리를 사용합니다. 그러나 몇몇 유니코드 문자는 3바이트 또는 4바이트로 인코딩되어 UTF-16보다 더 많은 메모리를 사용할 수 있습니다.

UTF-16은 모든 문자를 2바이트로 표현하기 때문에 BMP 안에 있는 문자에 대해서는 UTF-8보다 더 많은 메모리를 사용하지만, Supplementary Plane에 있는 문자를 다룰 때는 UTF-8보다 더 적은 메모리를 사용합니다.


UTF-8은 가변 길이 인코딩으로 메모리를 절약하면서 다양한 문자를 효율적으로 표현할 수 있습니다. 반면 UTF-16은 고정 길이 인코딩으로 모든 문자를 동일한 크기로 표현합니다.

 

 

 

 

// 문자열
String originalString = "안녕하세요! Hello!";
        
// 문자열을 바이트로 인코딩 (UTF-8 사용)
byte[] byteArray = originalString.getBytes(StandardCharsets.UTF_8);
        
// 바이트를 문자열로 디코딩 (UTF-8 사용)
String decodedString = new String(byteArray, StandardCharsets.UTF_8);

 

 


https://norux.me/31

https://gaeng-stroy.tistory.com/163