일단! 유니코드란?
유니코드는 모든 것을 뜻하는 Universal 과 Code((222))가 합쳐진 단어이다. 말 그대로 전세계의 모든 문자를 표현할 수 있는 코드를 이야기하는 것이다. 조금 더 개발자스럽게 이야기를 하자면, 세상의 모든 문자를 hex code 값이랑 1:1 mapping 시켜놓은 테이블이라고 볼수있다.
이 유니코드라는 놈은 “유니코드 컨소시엄” 이라는 단체에서 지정하고 관리하고 있다.
들어가기에 앞서 Code에 대한 내 맘대로 정의
문자열과 16진수값의 Mapping Table이다.
0x41 은 대문자 A를…0x20은 스페이스… 등등 이런식으로 저장(?)하는 방식을 말한다.
메모리에 0x41이 있는데, 이걸 모니터에 print 했을때 A라고 출력할수있도록 미리 정의한 것이다…라고 생각하면 될것 같다.
그럼 유니코드는 왜 만들어졌나?
옛날 옛날 메모리도 부족하고 컴퓨터가 구리구리 하던 시절, 컴퓨터는 오직 영어만 표현할 수 있었다. 왜냐구? 미쿡에서 만들었고 거기서 제일 많이 사용했으니까!
영어는 다들 알다시피 24개의 알파벳만 있으면 되기 때문에, 거기에 특수문자 등등을 더해도 128개의 공간만 있으면 세상(영어권) 모든것을 표현하는데 부족함이 없었다. 그때 만들어진 코드표(문자<->코드 mapping table)가 우리가 익숙히 알고 있는!! 개발자라면 꼭 알아야할 ascii code!
그런데 미국 회사들이 컴퓨터를 만들어서 세상 곳곳에 팔아먹다보니, 각 지역에서 “야! 우리 문자도 컴퓨터로 표현할 수 있게 만들어줘!!” 라는 요구사항들이 생겨나기 시작했다.
그래서 사람들은 어떻게 했을까? 당연히 땜빵을 하기 시작했다. (개발자들이 다 그렇지..머-)
그런데 그때만 하더라도 컴퓨터의 메모리나 처리 성능이 부족했던 시절!! 세상 모든 문자들을 표현하기엔 너무나도 많은 메모리가 필요했다. (만드는건 어떻게 할수 있겠지만, 시스템을 운영하는데 효율성이 떨어졌다…..결국엔 돈이 문제)
그래도 나온 땜빵이…
“야…각 나라별로 ascii code를 기준으로 잡고, 너희 나라 문자들을 추가해서 code를 만들어서 쓰면 안되겠니?” 에서 시작을 해서 각 국가별로 code page라는 녀석이 생겨버렸다.
이건…한글을 사용하는 시스템은 한글사전..한자는 한자사전..일본어는 일어사전을 들고 책을 보는 방식과 비슷했다. 그렇게 나라별로 code page가 생겨났고, 각각의 code page에 따라 동일한 byte값이 다르게 해석될 수 있도록 만들어졌다. 우리나라는 CP949(code page 949라는 뜻인데…949가 뭔지는 아직 모르겠다) 라는 것이 생겨나서 적용이 됐다. (한글 Windows 98에 처음으로 탑재)
그렇게 한참을 사용했는데…인터넷이 발전하고, 전세계가 통합(?), global한 세상이 오면서 문제가 생기기 시작했다. 나는 일본어를 할줄 아는데, 일본어 웹사이트에 들어가니 문자가 안보이기 시작한 것이다(물론 과장된 표현이다)
그제서야……”야..이제 컴터도 많이 좋아졌고, 언제까지 이렇게 나라별로 다른 code표를 쓸꺼냐? 이제 컴터도 좋아졌으니 “위키백과”처럼 만능 사전을 만들어서 한권만 있으면 전세계 문자들을 다 볼수있게 만들어보자!!!”
라고 해서 만들기 시작한게 유니코드이다~~~~라고 이해하면 조금 쉽지 않을까….
그럼, 최근 윈도우는 유니코드를 사용하나요?
이렇게 좋은걸(?) 전세계적으로 사용할 수 있게 만들어놨으니….최근 윈도우는 유니코드를 사용할까?
대답은 YES! 이다. 윈도우 NT부터 윈도우 커널은 유니코드를 기반으로 만들어졌으며(전세계 대상으로 판매를 하는 윈도우 입장에서는 당연한 선택이라고 볼 수 있다..) UCS2라는 인코딩 방식을 사용하다가 윈도우2000부터는 UTF16 인코딩 방식을 사용하고 있다.
오잉? 내가 쓰는 윈도우 터미널(cmd.exe)는 유니코드가 아닌거 같던데?
맞다. 윈도우 터미널은 시스템 언어에 따라 예전 CodePage 방식을 그대로 사용하고 있다. 아무래도 호환성의 문제인거 같은데, 이게 은근 귀찮다…그래도 어쩔수없다…MS 정책이 그러한걸 어쩌겠는가….
개발(VS)을 하다보면 유니코드 방식이 좋을지..MultiByte 방식이 좋을지 헤깔려요..
이건 그냥 회사 정책에 맞게 가는게 맞는거 같다. 개인적으로는 Visual Studio에서 프로젝트 옵션에서 설정할 수 있는 이 옵셥이 매우 마음에 안든다. 헤깔린다!!!
분명..내가 옛날옛날에 배울때는 유니코드 방식을 사용하면 한글자는 무조건 2Byte로 고정된다..그래서 뭐..어쩌구 저쩌구 해야한다고 배웠지만…MS가 UTF16방식을 채택하면서 대부분의 경우는 글자 하나가 2Byte를 차지하는게 맞지만, 기본적으로 유니코드에 정의된 모든 문자는 2Byte를 표현할 수 없기 때문에 경우에 따라서는 2Byte를 확장하여 4Byte로 표현되는 경우들이 발생하게 된다. 라는 사실과 과거 지식이 충돌나면서 사람을 괴롭힌다..(사실 코드에서는 크게 고려하지 않아도 되긴하지만…)
마지막으로 이것만 기억하자!! 유니코드는 2Byte가 아니다. 헤깔리지 말자. 이걸 1바이트 단위로 쪼개서 인코딩하면 UTF-8이 되고, 2Byte 단위로 쪼개서 인코딩하면 UTF-16이 된다. 유니코드는 전체 문자에 대한 mapping table이고, 이걸 적당한 방식(?)으로 인코딩해서 표현하는게 UTF같은 방식이 된다.