컴퓨터 이전의 부호화


모스부호 morse code,

1836년에 발명되어 1865년 International TelegraphyCongress에 의해 국제표준화 구격이 된 부호화 방법이다.

무선기에 연결된 스위치를 통해 전파를  On/Off로 입력하여 통신에 이용한다.


보코드

모스부호는 사람이 직접 수고를 하였다. 통신 분야가 발전하면서 보다 빠른 송신방법이 요구되었다.


텔레타이프 단말기가 등장하였는데, 타자기가 전화선에 연결되어있는 모양으로 키보드를 눌러서 문자를 입력하고 수신자는 수신한 문자를 프린터로 출력할 수 있었다.


이후 보다 많은 양의 정보를 교환하려는 필요가 생기고 펀치 테이프와 가독기를 연결하여 사용하게 되었다.


사람이 송신하고자하는 내용을 미리 펀치테이프에 기술하여 기계가 읽어들여 송신할 수 있는 구조이다.


이 텔레타이프 단말기가 연결된 국제적 통신기가 텔렉스다.

1931년에 최초로 서비스가 시작되었고 여기서 사용한 방식이 baudot code이다.


한 문자당 5bit로 on/off의 조합을 가진다. 즉 SOS는 총 15개의 bit로 표현하였다. 또 공백, 개행 등 제어 코드를 문제 세트에 추가하였다. 



EDSAC 문자코드

텔렉스로부터 약 20년 후 199년에 만들어진 EDSAC.


한 문자에 5bit를 사용하고 천공테이프(종이테이프에 구멍을 뚫어서)를 이용했다.


ASCII와 EBCDIC

EDSAC 이후에 10년간 다양한 컴퓨터가 만들어졌고, 문자 부호화 방식도 제각각이었다.

제각각인 문자 부호화 방법을 표준화하기위해 American Standard Code for Information interchange의 약자로 ASCII가 1963년에 제정의 되었다.


한 문자당 7비트를 사용하여 127종류의 문자를 표현했고 여기부터 소문자도 포함


하지만 1963년 이당시에 컴퓨터 시장을 장악하고 있던 IBM이 ASCII와 다른 EBCDID방식을 공개하였다.  결국 통일이 안되었고 심지어 EBCDID자체에도 여러 버그가 존재했다.

다른 부화화방식(문제체계와)과 호환에 문제가 있었다.


계속 불편..

결국 1984년 전 세계의 문자 부호화 방법을 통일하자는 움직임이 시작됐고 1984년 ISO가 universal Character Set(UCS) 표준화를 시작.

Xerox도 이와 별도로 1987년에 작업을 시작해서 1989년 최초 시안의 Unicode Draft1을 공개. 

결과적으로는 Unicode에 ISO의  USC가 일체화 되는 형태로 1993년에 국제화 표준이 됨 


이래서 전세계 문자를 포함한 문자집합 Unicode가 탄생





현재 프로그램 언어가 표현하는 문자열은 두가지가 있다.

C언어의 문자열은 자신의 길이를 알지 못하고, Pascal, Java, Ruby, Python은 문자열의 길이를 알고있다.




1. C 

하나의 문자를 8비트로 정의한다.

C언어의 문자열은 문자열이 시작되는 메모리상의 위치를 가지고있고 길이 정보를 가지고 있지 않아서 해당 위치에서 어디까지가 문자열인지 알수가 없다.


문자열의 끝을 표시하기 위해서 C언어는 문자열의 끝에 NUL 문자를 삽입한다. 

NUL은 0에 대응하는 문자이며 코드상에서는 \0으로 표현한다.


* ASCII에서 null character를 NUL이라고 쓰기로 정의한다.

C언어는 pointer를 다루는데 NULL pointer라는 개념이 있어서 문자열에 대한 NULL은 ASCII에서 표현하는 NUL이라고 기재하도록 한다.


8비트로 표현할 수 있기때문에 0~255로 표현할 수 있는 ASCII, 혹은 EBCDID의 문자



2. pascal 도 한 문자당 8비트로 표현한다.

하지만 pascal의 문자열은 문자열 앞부분에 길이정보를 가지고 있다. 대부분의 언어들은 문자열을 표현할 때 이와같이 표현되고있다.


3. java

자바에서는 한 문자는 16비트로 표시된다.

16비트로 표현되므로 0~65,535로 표혛날 수 있는 Unicode의 한 문자이다.



python은 자바와 같이 16비트의 unicode문자열과 pascal과 같은 8비트 문자열을 모두 지원한다.

python2 에서는 소스코드에 '아'라고 하면, UTF-8인 경우 3개의 바이트가 들어간 ['0xe3'. '0x81', '0x82']로 되고

u"아"라고하면 유니코드로 ['0x3042']가 된다.


파이썬2에서는 바이트열이 ASCII범위에 포함되면 ASCII로 간주되고 자동으로 UNIcode로 변환하는 설계로 되어있었다.

오로지 Unicode문자열에 바이트열을 결합하기 위해선 ASCII로만 이루어져있어야 가능했다.


하지만 이는 ASCII를 사용하지 않는 나라에서는 문제가 되었다. 

그래서 파이썬 3에서는 이전버전과의 호환성을 아예 버리더라도 유니코드가 기본이 되도록 하였다. 즉 '아'라고 하면 유니코드 문자열이 되고,

b'아'라고하면 8비트 문자열이 되도록 변경하여 유니코드를 손쉽게 사용할 수 있도록 하였다.  

그리고 문자열 형식의 형변환 시 명시적으로 하도록 했다. 


즉 유니코드 문자열에 바이트 문자열을 붙일 시에는 명시적인 형변환으 통해서 바이트 문자열을 유니코드로 형변환 한 후 문자열을 결합하여야 한다.







출처. 코딩을 지탱하는 기술

+ Recent posts