확장아스키코드를 문자형태로 출력할 수 있을까를 알아보다가 의문이 생긴 부분에 대해 정리하고자 한다.
주제를 시작하기 전에 가장 기본이 되는 유니코드와 각각의 운영체제의 기본 문자체계에 대해 알아보고자 한다.
유니코드
유니코드와 UTF-8의 방식을 혼동하는 경우가 많은데, 이는 개념적으로 분명 다르다.
유니코드는 전 세계에서 사용하는 많은 문자들 각각에 부여한 코드들의 집합이다. 전세계에서 통일한 처리를 할 수 있게 만들어졌으며. U+XXXX의 형식으로 표기된다. 그리고 UTF-N 즉, UTF-8, UTF-16, UTF-32등은 이러한 유니코드 기반의 문자들을 바이트열에 표현하는 방식을 말한다. 즉 표에 있는 코드를 바로 적용하는 아스키와는 다르게 별도의 인코딩 방식이 필요하다는 것을 알 수 있다.
맥의 기본 문자표(UTF-8)
맥은 여기에서 UTF-8 방식을 기본 문자표로 따른다.
인코딩하려는 문자의 코드가 속한 범위에 따라 1byte~4byte로 인코딩하는 가변 길이 인코딩 방식이다. 8bit(1byte)기반의 인코딩 방식니기에 이렇게 부른다. 자주 사용하는 문자는 1 byte로 표현하고, 그렇지 않은 문자는 긴 바이트로 표현하여 저장 공간을 효율적으로 사용하는 방식이다.
즉, 기본 아스키코드(0~127)에 속한 문자들은 1byte에 인코딩된다.
따라서 우리가 별도의 처리 없이 확장 아스키코드를 출력하는 경우 UTF-8에서 유효하지 않은 바이트나 byte sequence이기 때문에 �와 같은 문자로 나타난다.
윈도우의 기본 문자표(CP949 또는 MS949)
한국어판 Microsoft Windows의 기본코드 페이지로, 2byte(16bit)로 하나의 문자를 표현하는 방식이다.
ANSI(확장아스키)를 한국에서 확장한 EUC-KR의 문자수의 한계를 극복하기 위해 나온 모델이다. 그렇다면 확장 아스키코드가 있으려니 하고 문자표를 직접뒤져보니 한글과 한자의 문자수를 위해서인지 그냥 아스키모드만 가능하도록 잡아놨다.
이렇게 체계가 다르기 때문에 윈도우의 파일을 맥으로 가져오거나 할때 글자의 깨짐이 발생하는 것이다.
그렇다면 확장아스키코드를 출력하기 위해 각 운영체제에서는 무슨 과정을 거쳐야 하는가?
윈도우의 경우 cp949인 코드페이지를 CP1252(Windows-1252, ISO-8859-1, 라틴 알파벳 문자 집합) 사용로 변경해주몀 된다.
또는, 출력 스트림을 유니코드 모드로 설정 후 유니코드 문자 함수를 사용하면 된다.
'C' 카테고리의 다른 글
tolower 함수의 구현 (2) | 2023.10.16 |
---|---|
toupper 함수의 구현 (0) | 2023.10.16 |
strlcat 함수의 구현 (+strlcat 함수의 리턴값에 대해) (2) | 2023.10.16 |
memmove 함수의 구현 (+ memmove함수와 memcpy함수의 차이) (2) | 2023.10.16 |
strlcpy 함수의 구현 (0) | 2023.10.16 |