본문 바로가기
공부하는 하스씨/안드로이드

[펌강좌] 문자셋, 인코딩 이야기 #2

by 박하스. 2010. 2. 23.
728x90
반응형

신비로 JAVA월드 의 Soony(fstars@shinbiro.com) 님의 강좌글 펌

http://club4.shinbiro.com/clb/bbs/sbrClbBbs_View.jsp?bbsid=50354&pg=2&artno=425


[들어가며]

오호 통재라~ 어찌 오늘도 할일 없이 웹서핑이란 말이냐..ㅡ_ㅡ;

지난번에 이어서 이야기를 서둘러 시작해보자.. "약주한잔하고 집필하라"는 고마운 말씀도

있었으나 회사인 관계로 약주는 생략하자.

 

[주의]

이 글은 정말 초보를 대상으로 작성된 글로써 필자는 이글에서 논의되는 내용의 좀더 심층적인

문제나 어투등을 문제 삼는 리플을 정중히 사양합니다. 단, 잘못된 점의 지적은 환영합니다.^^

표현의 원할함을 위해서 존칭은 생략했습니다.

 

[2. 문자 1개는 1Byte~]

이전글의 기억을 조금 상기시켜보자. 이진 Bit 흐름 밖에 알아먹지 못하는 컴퓨터에게 문자를

다루도록 하기 위해서 미국넘들은 ASCII Code 라는걸 기준으로 채택하였으며 이 코드표에는

총 128가지의 약속이 있어서 이를 표현하려면 7비트의 경우의 수가 필요하다고 했다.

 

그런데 사실 7비트는 맘에 안들기는 하다. 나누고 붙이고를 좋아하는 비트 연산의 입장에서는

짝수가 맘에 들었나보다. 그래서 우리는 1Byte = 8Bit 라고 알고 있는것처럼 기본 단위는

8비트이니 7비트의 ASCII 코드를 8비트에서도 판독이 가능하도록 조정하고 이후 모든 컴퓨터

에서는 1바이트 단위로(즉, 한번에 8Bit씩) 읽어들이게 하면 읽어들인 1바이트마다 1개의 문자를

표현할 수 있게 되는것이다.

 

그럼 조정은 어떻게 하느냐..

예를 들면

0100001     --> 'A'         (자릿수 하나당 비트 하나씩 즉, 7비트이며 현재 십진수로는 65를

                                    나타내고 이는 ASCII Code 에서는 대문자 A를 나타낸다)

이 7비트의 앞에 0값의 비트 하나를 더 추가한다.

00100001   --> 'A'        (자릿수가 하나늘어난 8비트가 되었다. 그러나 앞에 붙은게 겨우 0이

                                    므로 십진수로 변환하면 여전히 65의 값을 가진다. 그러므로 대문자

                                    A를 나타낸다.)

 

이해가 될려나..-_-; 즉, 7비트 오리지날 ASCII 로 작성된 글을 한문자씩(7비트씩) 읽어서 그

읽은것에 0인 Bit 하나를 추가하면 8비트 단위의 ASCII 로 변환이 가능한것이다.

(사실 이거 별 필요는 없다. 요새 7비트 인코딩 전송은 특별한 경우가 아니면 사용하지 않기

때문이다. 요즘엔 한 문자는 1Byte, 즉 8Bit 라고 널리 인정되고 있기 때문이다.)

 

[3. 문자, 서유럽으로 확장되다]

ASCII Code는 미국넘들이 자국 내에서의 정보 통신을 위해 만든것이다. 당연히 지들 쓸것만

집어넣은 것이니 미국넘들에게는 필요없는 움라우트찍은 O (즉, 이거 "Ö") 라든지 것들은

ASCII Codeset 128가지 문자에는 없는것이다. 아무리 영어가 세계어라지만 독일이나 기타

유럽어를 사용하는 나라 애덜이 기왕이면 자기나라의 문자도 표현되었으면 좋겠다고 생각할

것은 당연한 일...

 

컴퓨터가 미국에서만 쓸거라면 상관없지만 어디 그러한가.. 이제 세계는 바야흐로 컴퓨터 세상

인것을.. -_-;

 

그러나 전 강좌에서도 이야기 했지만 128가지는 이미 7Bit의 경우의 수를 다채운 것이다.

만약 이보다 더 문자를 넣고 싶다면 Bit가 늘어나야한다.

다행히 기본 단위는 7비트가 아니고 8비트 이므로 맨 앞 1비트가 비어있다.

7비트는 128가지 ,   그러나 8비트는 2의 8제곱이므로 256가지

즉, 비트 하나가 더 추가 됨으로서 나머지 뒤쪽 128가지의 경우를 더 적용할 수 있는 여유가

생긴것이다.

 

여기서 한가지 집고 넘어갈것은 그렇게 가능하면 Bit수를 줄이려고 노력하던 예전 하드웨어

시절에서 움라우트 글자나 몇개 집어넣을거면 ASCII Code 에서 부호몇개 움라우트 글자로

대체해서 128가지를 새롭게 자기들 방식으로 맞추면 되는거 아니냐 하시는 분들은 "호환성"

이라는 글자를 가슴에 집어넣어주자..-_-;

그렇다.. 호환성이다.. 위의 가정대로 만약 독일이 자기 나름대로의 새로운 글자조합 128가지를

만들었다면 이는 독일 내에서만 사용되어야 하지 미국넘이 ASCII Code 로 작성해서 보낸

문서는 오류가 나타나게 된다.

 

즉, ASCII Code 에서는 33번째 문자에 "!"를 할당하였는데 독일 넘들은 우린 느낌표안써! -_-;

라며 대신 거기다 움라우트 A 를 집어넣으면 어떻게 될까.

미국넘이 본문에 "A!" 라는 2글자를 전자메일로 독일에 보냈다.

A! 라는 글자는 ASCII Code 테이블에 맞추어 00100001 00010001 요렇게 2개의 바이트로

변환되고 이것이 독일쪽으로 전송된다. 

받는쪽 독일 컴퓨터에도 00100001 00010001 라는 바이트는 변함이 없다.

그러나 여기서 독일쪽 컴퓨터는 이를 문자로 변환할때 ASCII Code를 사용하는게 아니고

자체 코드를 사용하여 "AÅ" 이라고 표현해 버린다.

이게 몬가.. 전달하려는 의미를 완전히 무시해 버린게 된것이다. -_-;

한술 더떠서 ASCII Code 와는 기본 알파벳 순서 마저 다르다면?

 

그래서 호환성이 필요한 것이다.

 

미국 표준협회에서 관장하던 ASCII Code는 어느덧 하드웨어가 발달하고 컴퓨터를 사용하는

지역이 전세계로 확장됨에 따라 ISO (국제 표준 협회) 라는 기관에서 표준 글자 코드를 관장

하게 되었다.

 

ISO는 기본 ASCII Code를 충분히 호환하면서 서유럽 언어까지 사용가능한 새로운 문자셋을

채택하니 이른바 ISO-8859-1/Latin1   이다.

 

Latin1 문자셋은 앞쪽 128 (즉, 0~127까지) 에는 기본 ASCII Code를 그대로 계승하여 호환을

유지하고 뒤쪽 128 (즉, 128~255까지) 에 움라우트 붙은 글자들과 같은 서유럽 고유의 문자들

을 배치하여 문자셋을 정의하였다.

 

이제부터 문서 인코딩을 서유럽어(ISO-8859-1/Latin1)으로 세트하면 미국에서 작성한 문서나

독일에서 작성한 문서나 가리지 않고 같은 내용을 표현할 수 있게 된것이다.

 

세월은 흘러 1980년대 초 ....

동아시아에도 컴퓨터가 제법 보급되기 시작한다.

 

그당시에는 가장 발달 순서가 높았던 일본넘들이 일본어를 컴퓨터로 표현하고 싶어했다..

(아마 다음 강좌나 다다음 강좌에 표현하고 싶어 할것이다. -_-;)

 

[마침]

뭔가 할말은 많으나 꼭 쓰다보면 논지가 흐려지는 것이 아무래도 글쓰기에는 별다른 재주가

없나보다. 그나마 태클없이 이 부족한 글을 읽어주시는 몇몇 자월분들에게 고마울 뿐이다.

 

 

728x90
반응형