본문 바로가기

개발 관련/etc

아스키(ASCII)

아스키(ASCII)

아스키 코드, 즉 ASCII는 'American Standard Code for Information Interchange'의 약어로, 정보 교환을 위한 미국 표준 코드란 뜻이다.

아스키는 128개(=$ 2^7 $)의 문자 집합을 제공하는 7 bit 부호이다. 처음 32개의 문자는 인쇄와 전송 제어용으로 사용되는 제어문자로 출력할 수 없고, 마지막 문자를 제외한 33번째 이후의 문자들은 출력할 수 있는 문자들로, 기호와 숫자, 영대소문자로 이루어져 있다.

아스키는 숫자 '0~9', 영문자 'A~Z', 'a~z'가 연속적으로 배치되어 있다는 특징이 있으며, 이러한 특징때문에 프로그래밍에서 유용하게 활용된다.


확장 아스키(Extended ASCII)

일반적으로 데이터는 byte 단위로 다뤄지는데 아스키는 7bit 이므로 1bit가 남는다. (* 1 byte = 8 bit)

이 때 남는 1bit를 활용하여 문자를 추가로 정의한 것이 '확장 아스키'이다.

확장 아스키에 추가된 128개의 문자는 여러 국가와 기업에서 서로의 필요에 따라 다르게 정의해서 사용되는데, ISO(국제표준화기구)에서 몇 가지 발표한 것이 익숙한 'ISO 8859-1'이다. 그 외에도 'ISO Latin 1'이라고 하는 서유럽에서 일반적으로 사용하는 문자들을 포함하고 있는 확장 아스키 버전도 발표했다고 한다.


확장 완성형(CP 949)

한글을 표현하는 방법은 조합형과 완성형이 있는데, 조합형은 초성, 중성, 종성을 조합하는 방식이고, 완성형은 확장 아스키의 일부 영역(162~254)에 해당하는 두 문자코드를 조합하여 한글을 표현한다.

현재 조합형은 사용되지 않고, 완성형(KSC 5601)에 없는 잘 쓰이지 않는 8822글자를 추가한 확장 완성형(CP 949)가 사용된다. 이 확장 완성형 CP 949가 한글 윈도우에서 사용되는 문자 인코딩이다. 참고로 영문 윈도우는 CP 437을 사용한다.


유니코드(Unicode)

인터넷이 발명되면서 서로 다른 지역의 다른 언어를 사용하는 컴퓨터간의 문서 교환이 활발해지면서 서로 다른 문자 인코딩을 사용하는 컴퓨터간의 어려움이 생겼다. 이러한 어려움을 해소하고자 전 세계의 모든 문자를 하나로 통일된 문자집합으로 표현하고자 노력하였고, 그것이 바로 유니코드이다.

유니코드는 처음엔 모든 문자를 2 byte(=$ 2^{16} $ = 65536)로 표현하려 했으나, 2 byte도 부족해서 21bit로 확장되었다.

유니코드는 먼저 유니코드에 포함시키고자하는 문자들의 집합을 정의하였는데, 이것을 유니코드 문자 셋(=character set, 캐릭터셋)이라고 한다. 그리고 이 문자 셋에 번호를 붙인 것이 유니코드 인코딩이다. 

유니코드 인코딩에는 UTF-8, UTF-16, UTF-32 등이 있는데, 자바에서는 UTF-16을 사용한다.

UTF-16은 모든 문자를 2 byte의 고정 크기로 표현하고 UTF-8은 하나의 문자를 1~4 byte의 가변 크기로 표현하며, 두 인코딩 모두 처음 128문자가 아스키와 동일하다. 즉, 아스키를 그대로 포함하고 있는 것이다.

 

모든 문자의 크기가 동일한 UTF-16이 문자를 다루기에는 편리하지만, 1byte로 표현할 수 있는 영어와 숫자가 2byte로 표현되므로 문서의 크기가 커진다는 단점이 있다. 

그에 반해 UTF-8에서 영문과 숫자는 1byte, 한글은 3byte로 표현되기 때문에 문서의 크기가 작지만 문자의 크기가 가변적이므로 다루기 어렵다는 점이 있다. 인터넷에서는 전송속도가 중요하므로, 문서의 크기가 작을수록 유리하다. 그래서 UTF-8 인코딩으로 작성된 웹문서의 수가 빠르게 늘고 있다.

 

 

 

[참고] 자바의 정석