문자코드 조사 정리

Download Report

Transcript 문자코드 조사 정리

1. 코드(CODE)
어떤 대상을 간략하게 표시하기 위한 일종의 약속. 우편 번호, 주민등록번호, 학번,
군번 등이 코드의 예이며 문자 코드도 많은 코드 중 하나다
2. 문자 코드(CHARSET-CODED CHARACTER SET)
①단일 문자의 내부 표현을 나타내는 코드로 컴퓨터에서 문자를 표현하기 위해, 각
문자를 정수값에 대응시켜 놓은 일종의 대응표
②컴퓨터는 숫자만, 그것도 이진수만 다룰 수 있는 존재이고 무나를 직접 다룰 수
없기 대문에 문자를 표현하기 위해서는 개별 문자를 고유의 숫자값에 대응시켜
야만 한다.
③문자와 숫자의 대응 관계를 정의한 체계이며 대응시키는 방법에 따라 여러 가지
종류가 있다.
ex)
1. euc-kr charset이라면, 영숫자와 한글 그리고 일부 특수문자와
한자들을 정수값에 대응해 놓은 것.
2.euc-kr환경에서 한글을 입력하면, 컴퓨터는 euc-kr charset에서
각 문자별로 지정한 정수값을 쓰게 된다.
④종류
-ASCII 코드: American Standard Code for information interchange의 약자
미국에서 표준화가 추진된 정보교환용 7비트 부호로 PC를 중심으로
국제적으로 사용
가장 흔하고 오래된 문자 코드
-표준 BCD코드: Binary-Coded Decimal Code의 약자.
숫자,영자,특수 기호를 나타내기 위한 6비트 + 오류 검사용 1비트로 전
체 7비트로 구성.
-EBCDIC코드: Extended Binary Coded Decimal Interchange Code의
약자, 8비트의 조합에서 1자를 표현하는 부호체계.
이 8비트를 1비트라 하며 1바이트로 영자(A-Z),
숫자(0~9), 특수기호 등 256종의 문자를 표현할
수 있다.
특히 숫자는 4비트를 사용하여 16진법으로 표현
-유니코드: 컴퓨터에서 세계 각국의 언어를 통일된 방법으로 표현할
수 있게 제안된 국제적인 문자 코드 규약
-한글코드: 컴퓨터 내부에서 한글을 표시하기 위해 사용되는 코드로
서 행망 표준 코드인 2바이트 완성형 외에도 2바이트 조합
형, n바이트형, 3바이트형 등이 있다.
3. 문자 인코딩(인코딩)
①문자를 표현하는 정수값을 어떤 bit배열로 표현할 것
문자 인코딩을 통해 부호화되어, 복호화하면 본래의 문자나 기호를 뜻하게 되는 부
호를 문자 코드라 한다.
ex) 모스 부호: 전건을 길게, 또는 짧게 두드려서 라틴 알파벳을 나타내는 방법
아스키: 라틴 알파벳, 숫자, 특수 문자 등을 정수와 그에 대응되는 7비트 이진수로
표현하는 방법
②대부분의 경우 charset과 encoding을 구별할 필요가 없다. 정수
값을 bit배열로 표현하는 방법은 하나있기 때문이다. 그러나
unicode 경우에는 UTF-8, UTF-16 같이 몇 가지 다른 인코딩을 사용
한다.
문자코드가 같다면, 그 문자코드를 지원하는 어떤 인코딩을 사용
하든지, 각 문자에 대응하는 논리적인 정수값은 동일하지만, 실제
로 기록되는 bit배열은 인코딩에 따라 달라질 수 있다. 이 경우, 제
대로 데이터를 주고받으려면 문자코드 뿐 아니라 인코딩까지도
맞춰야한다.
③문자 집합은 ASCII와 같이 더 이상의 문자가 추가될 수 없기도
하고, 유니코드와 같이 문자가 계속 추가될 수 있기도 하다.
일반적으로 문자 집합과 문자 인코딩은 어떤 문자를 사용할 수 있
으며 어떤 식으로 표현되는지를 나타낸다는 데서 동의어로 취급
되기도 한다. 역사적인 이유로 MIME이나 그에 기반한 시스템은
문자 집합을 문자 인코딩을 나타내는 데 사용한다.
-문자 인코딩 형태: 유니코드 코드 포인트를 8비트 숫자의 집
합으로 나타내는 UTF-8이나, 16비트 숫자의 집합으로 나타내
는 UTF-16, 그리고 대부분의 일반적인 문자 인코딩들이 포함
된다.
-문자 인코딩의 구성
문자 인코딩 형태로 변환된 코드값을 옥텟 기반의 시스템에서 사용
하기 위하여 옥텟들으로 변환하는 방법이다. 대부분의 문자 인코딩
형태는 이 과정에서 아무런 일도 일어나지 않으며, 8비트 이상의 숫
자를 사용하는 UTF-16과 같은 문자 인코딩 형태의 경우 엔디안을 지
정해 주는 것으로 충분하다. 여기에는 ISO 2022와 같은 복합 인코딩
이나, SCSU와 같은 압축 방법 등이 속한다.
7비트 크기로 영문자와 숫자, 기호들을 대응시킨 아스키(ASCII) 코드이며 지
금도 많이 사용될 뿐만 아니라
이후 확장된 문자 코드들도 아스키를 기반으로 한다. 윈도우즈의 유저, GDI
모듈이 사용하는 ANSI 문자셋과 FAT 파일 시스템이 사용하는 OEM 문자셋도
아스키 문자셋에 기반하되 0x80이후의 문자가 약간 다르게 정의되어 있다.
아스키 문자셋이나 ANSI문자 셋처럼 한 바이트로 한 문자를
표현하는 문자 코드를 SBCS(Single Byte Character Set)라고 한다. 바이트 단
위이기 때문에 최대256개의 문자를 표현할 수 있다.
그러나 이 코드는 애초에 미국의 문자에만 맞게 작성되었기 때문에 독일어
나 불어 등의 특별한 기호를 가진 문자를 표현하기에 부족했으며
더구나 알파벳과 모양이 완전히 다른 그리스나 러시아의 문자는 전혀 표현
할 수가 없었다.
그래서 아스키 코드를 확장한 확장 아스키 코드를 정의하고 같은 코드에 이
중으로 문자를 할당할 수 있는 방식인 코드 페이지로 새로운 문자들을 표현
하고자 노력했으나 근본적인 해결방법이 되지 못했다.
왜냐하면 특정 코드 페이지에서 작성한 문서를 다른 코드 페이지에서 읽을
수 없어 문서 교환이 어려운 난점이 있기
때문이다.
또한 서양 국가들의 문자는 대부분 8비트 범위 내에서
표현할 수 있지만 한국, 중국, ㅇ리본 동양 3국(CJK라고
한다)의 문자는 그 보다 문자수가 훨씬 더 많으므로 한
바이트로 모든 문자를 표현할 수가 없다. 그래서 동양 3
국은 문자 하나를 표현하기 위해 2바이트를 사용하는
DBCSD(Double Byte Character Set) 체계를 사용해 왔으
며 이 체계는 현재까지도 계속 사용되고 있다.
우리가 현재 사용하고 있는 DBCS는 영문, 기호는 8비트
로 표현하고 한글은 16비트로 표현하는 ANSI의 확장형
문자 코드이다.
SBCS와 DBCS가 섞여서 존재하며 때로는 16비트를 넘
을 수도 있기 때무눈에 MBCS(Multi Byte Character Set)
라고 한다.
"럭키Seoul"이라는 문자열은 메모리 상에 다음과 같이
표현된다.
Ex)
--------------------------------------------------------------럭 키 S e o u l \0
---------------------------------------------------------------
(2byte)(2byte)
한글은 2바이트를 차지하며 영문은 1바이트만 차지한다. 한 문자의 길
이가 일정하지 않기 때문에
바이트 길이만으로 문자의 개수를 정확하게 알 수 없는 문제가 있는데
"럭키Seoul"이라는 문자열은
모두 7개의 문자로 이루어져 있지만 배열의 크기는 9바이트(널을 제외
하고)이다. 문자열중에 2바이트 짜리 문자가
몇 개나 있는지 처음부터 순서대로 세어 와야만 문자 개수를 정확하게
알 수 있다. 똑같은 길이라도
문자열을 구성하는 문자에 따라 개수가 달라지는 것이다.
또한 문자열 중간에서 바로 앞 문자를 구하고 싶을 때도 일반
적인 방법으로는 구할 수 어벖으며 반드시 선두에서부터
문자를 하나씩 읽어와야만 한다. 왜냐하면 중간 위치가 문자의
선두인지 2바이트 문자의 뒷부분인지를 정확하게 알 수 없기
때문이다.
각 바이트가 2바이트짜리 문자인지 아닌지는 IsDBCSLeadByte
함수로 조사할 수 있는데 버퍼 처음부터 이 함수로 각 문자의
길이만큼 이동해야 한다.
DBCS문자열의 앞 뒤 분자를 구할 때는 CharPrev, CharNext라는
함수를 사용할 수도 있으나 CharPrev 함수의 경우 속도가 굉장
히 느리고 비효율적이다.
길이와 앞문자를 구하기의 비효율성보다 더 큰 문제가 있는데
DBCS는 각 코드 페이지에 따라 실제로 맵핑되어 있는 문자가
달라질 수 있어 국제적인 범용 프로그램 제작에는 부적당하다
는 것이다.
"럭키Seoul"이 한글 윈도우즈에서는 그대로 보이지만 중
국어 윈도우나 일본어
위닌도우에서는 한글 코드 영역에 히라가나, 또는 한자
코드가 맵핑되어 있으므로 이대로 보일 리가 없다. 마찬
가지로 우리가 일본 웹 사이트에
접속하거나 중국어 문서를 읽을 때도 제대로 보이지 않
고 엉뚱한 한글이 보인다.
외국 문서가 정확하게 출력되려면 코드 페이지를 정확
하게 선택해야 하는 불편함이 있다. 그나마도 코드 페이
지란 특정 국가의
코드에 무나를 강제로 맞추는 것이기 때문에 여러 나라
의 언어를 동시에 표현하고자 할 때는 전혀 도움이 되지
못한다.
예를 들어 한글로 된 일본어 교본이라든가 한중일 문자
를 비교하는 논문을 작성할 대는 동시 표현을 할 방법이
없는 것이다.