문자의 표현
전기 신호는 전구의 빛이 ‘들어왔다/안들어왔다’ 하는것이 디지털 신호로 이진수인 ‘1/0’으로 변환되어 표현이 된다. 컴퓨터 초창기에는 데이터 저장 및 처리에 있어서 복잡한 연산을 다루기에는 제한이 많았기 때문에 1byte가 4bit 였다.
이후 데이터 처리의 요구사항이 증가하고, 더 많은 정보를 표현할 필요성이 생겼다. 이로써 컴퓨터는 사람이 인식할 수 있는 문자로 표현이 필요했다.
컴퓨터는 영어권에서 시작되고 발전되었기 때문에, 영문를 표현하는데 필요한 코드들의 숫자가 7bit ~ 8bit면 충분했다. 모든 기기마다 숫자와 문자가 각기 다르게 맵핑 되어 있다면, 데이터를 전송되었을때, 상호간에 데이터 불일치가 발생한다. 이를 표준화하기 위하여, 숫자와 문자가 맵핑되는 기준 표를 만들었다. 그것이 아스키코드 표이다. 아래의 설명에서 아스키코드(ASCII)를 보면 쉽게 와 닿을 것이다.
ASCII
ASCII는 American Standard Code for Information Interchange으로 아메리카 기준 코드 교환 정보이다. 아래의 아스키코드 표를 보면, 2⁷ 만큼의 크기로 영어 문자와 함께 기호등을 표현이 가능하다. 즉, 아스키 코드(ASCII)의 저장단위는 7bit이다.
ASCII는 영어권 기준이며, 문자(Character)를 인코딩(Encoding) 디코딩(Decoding) 할 수 있게 해준다. 코딩(coding)한다는 것은 인간이 컴퓨터가 이해할수 있는 코드를 작성하는 행위를 뜻한다.
언어는 소통하는데 필요하며, 인간의 언어를 컴퓨터가 이해 할 수 있는 컴퓨터 언어로 변환하는 과정이 필요하다. Encoding이란, 문자를 이진수로 변화하는 것이고, Decoding은 이진수를 문자로 변환하는 것이다. en은 ~되게 하다라는 의미이고, de 역방향이다.
Parity Bit
데이터 통신 과정 중에 전송된 문자가 오류가 발생했는지 안했는지 판별하기 위한 정보가 필요했다. 그래서 1bit크기의 패리티 비트(Parity Bit)까지 추가적으로 포함되어있다. 아스키 코드(ASCII)의 저장단위인 7bit에 Parity Bit 1bit가 더해저 총 8bit이다. 인간의 문자표현과 데이터 전송에 대한 안정성을 확보하기 위함이다.
Parity Bit가 어떻게 동작하는지 알기 위해, 먼저 어원을 알아야한다. Parity란 한국말로 동등이란 뜻이다. Parity Bit를 포함하여 1의 개수가 짝수(짝수 패리티비트)나 홀수(홀수 패리티비트) 개가 되도록 한다.
통신이 시작될 때 송신자와 수신자 간에 hand-shake 과정에서 짝수 패리티 비트와 홀수 패리티 비트중 어떤 방식을 선택할지 결정된다.
만일 짝수 패리티로 결정되었다면, 패리티 비트를 포함하여 1의 개수가 짝수여야한다. 이후 세션이 성립하고 데이터 전송 과정에서 11010010에서 5번째 자리의 수가 바뀌어 1로 변조 되었다면, 수신 호스트는 11011010을 받는다. 그러므로 1의 개수는 홀수 개가 된다.
수신 호스트는 패리티 검사를 하여 1의 개수가 홀수로 변경되거나, 누군가 변조했다는 것을 알 수있다. 다만, 데이터 전송 과정에서 1 bit까지만 오류가 발생했음을 확인할 수 있다. 2 bit 만큼의 오류가 발생하면, 원래대로 짝수가 되기 때문이다.
Unicode
Unicode는 Universal Code이다. 기존의 ASCII는 영어권을 위한 en/decoding 방식이였지만, unicode는 전세계의 언어를 위한 en/decoding 방식이다. 만일 unicode가 없다면, 웹사이트는 한국, 미국, 중국 등 각 나라별 인코딩 방식을 써야한다. 각 언어마다 어떤 숫자와 맵핑이 되는지 알아야하기 때문이다.
한국의 경우에는 따로 EUC-KR 인코딩 방식을 사용하여 2byte로 표현되었다. 그렇다면 어떤 서비스에서 개발할때, EUC-KR 인코딩 방식으로 인코딩과 디코딩이 필요하다. 그래야만 올바르게 한국어가 숫자(컴퓨터 언어)로, 숫자(컴퓨터 언어)가 한국어로 표시된다. 하지만 개발할때 일일히 언어 마다 인코딩 방식을 수행하는 것은 반복적인 작업과 여러번의 연산 비용만 초래한다.
그리하여 unicode가 있으므로, 여러 나라의 인코딩 방식을 통합할 수 있는 것이다. 그 인코딩 방식을 UTF(Unicode Transformation Format)이다. UTF-8, UTF-16, UTF-32 등이 있다. 그중에서 가장 대중적인 것은 UTF-8이다.
UTF-8은 ASCII 문자 코드 값을 그대로 보존하는 유니코드 가변 길이 인코딩 형식이다. 가변 길이 인코딩이란 것은 영어를 표현할때는 1byte로, 한글을 표현할때는 3byte로, 각 언어마다 적절한 용량으로 표현을 하기 위한 인코딩 방식이다. 따라서 몇바이트로 인코딩과 디코딩을 할건지 표시를 해야한다. 그 표시가 코드 포인트이며, 유니코드 문자에 부여된 값의 범위이다.
아래의 코드포인트 범위(Code Point Range)로 몇바이트로 인코딩 할건지를 결정하는 것이다. U+0080는 16진수 표기이며, 16진수 0080은 10진수로 128이다. UTF-8로 인코딩한 결과의 크기는 1~ 4 byte 까지 나올 수 있다. 한의 경우에는 D55C이라서 UTF-8로 인코딩하면, 3byte로 표현된다.
아래의 표는 유니코드에서 한글 문자와 문자마다 붙여 놓은 번호를 코드 포인트를 볼 수 있다. '가' 의 코드포인트는 AC00 이고, 코드 포인트는 U+AC00 으로 표현한다.
자바에서는 내부적으로 UTF-16을 쓴다. UTF-16은 모든 문자를 2byte의 고정 크기로 표현한다. UTF-8처럼 문자의 크기가 가변적으로 다루는 것보다, 모든 문자를 동일한 크기로 다루어서 편리하다.
그러나 영어나 숫자는 1byte로 표현이 가능하므로, UTF-16로 인코딩된 문서에서 영어나 숫자로 많이 저장되어 있다면 메모리 낭비가 발생한다. 반면에, UTF-8에서 한글은 3byte로 표현되고 기타 다른 언어도 3 ~4byte의 크기를 차지한다. 이렇게 UTF-8에도 메모리 낭비가 있긴하다.
인터넷에서는 전송속도가 중요하므로, 각 언어마다 용량에 알맞는 가변 길이 인코딩 방식의 UTF-8을 사용한다. UTF-8을 쓰면, 웹상에서 UTF-16보다 효율적으로 데이터를 주고 받을 수 있다.
'Basic' 카테고리의 다른 글
컴퓨터의 연산 원리 (논리 회로와 가산기) (0) | 2024.05.28 |
---|---|
진법 변환과 음수의 2진 표현(부호 비트와 보수) (0) | 2024.05.25 |