본문 바로가기
Software/C++&MFC

문자 인코딩 - 유니코드와 멀티바이트란 무엇인가?

by lovey25 2018. 10. 25.

코딩을 하다 보면 변수형이 달라서 발생하는 컴파일 문제를 해결하기 위해 많은 시간을 보내곤 합니다. 기본부터 차근차근 프로그래밍을 배운 사람이라면 이런 어려움을 격지 않을지 모르지만 저처럼 필요에 의해, 취미로 코딩을 시작해서 과정보다는 결과만 쫓는 코딩 경력으로는 상당히 난해한 문제입니다.

그래서 조금이라도 도움이 되려니 하는 생각으로 배경이 되는 지식부터 정리를 해 봅니다.

인코딩

인코딩이랑 무엇인가? 막연히 문자를 컴퓨터가 이해할 수 있도록 변환한 코드? 변환과정? 정도로 이해하고 있습니다.
컴퓨터는 on/off의 2진 신호로 데이터를 처리하게 되어있고, 따라서 숫자는 진법 변환으로 인간과 컴퓨터가 같이 이해를 할 수 있습니다. 그러나 문자는 그렇지 못하기 때문에 특정 문자와 숫자(코드)를 연결하는 코드가 필요해지는데 이것을 문자 인코딩이라고 생각하면 됩니다.

인코딩 규칙에는 다양한 것들이 있습니다. 컴퓨터가 만들어진 초기에는 ASCII, EBCDIC 등이 대표적이었는데, 당시에는 영어가 주로 사용되어 영어 외 문자는 널리 사용되지 못했습니다. 그래서 각 언어권에서 영어 외의 문자를 정의하는 코드를 만들어냈고 그 결과 다양한 코드들이 생겨나게 되었습니다. 동시에 사용하는 코드가 통일되지 못해 한글, 한자 등 이 깨지는 문제들도 발생하게 되었죠. 
그래서 이를 해결하기 위해서 유니코드(Unicode)가 개발되었습니다. 이 코드는 국제 표준으로 관리되고 있으며, 전 세계 모든 문자를 컴퓨터에서 일관되게 사용할 수 있도록 해줍니다.

유니코드 문자집합 VS 멀티바이트 문자집합(MBCS)

유니코드에 대해서 이제 감을 잡은것 같은데, 코딩을 하다보면 멀티바이트, 싱글바이트 뭐 이런 얘기들을 볼 수 있습니다. 인코딩 관련 문제로 컴파일 오류가 발생해서 구글이나 네이버에서 해결 방법을 찾다 보면 심심찮게 볼 수 있는 것이 

"visual studio에서 문자집합의 프로젝트 기본값을 '멀티바이트 문자 집합 사용'으로 하면 해결" 

된다는 글을 볼 수 있습니다. 앞에서 유니코드가 뭔지 알아봤으니 이제 이 유니코드가 어떻게 생긴건지 좀 더 알아봐야겠습니다. 

그전에 대표적인 코드인 ASCII코드를 먼저 살펴보자. ASCII는 영어, 숫자, 부호 등 128개의 문자를 1바이트로 표현하도록 구성된 코드입니다. 1바이트는 8비트인데 데이터 타입이 sign인 경우 최 상위 비트 1개는 부호 판별용으로 사용되어 데이터로 쓸 수 있는 나머지 7비트를 10진수로 나타내면 128이죠. 
따라서 ASCII는 1바이트만 사용하도록 만들어져서 원래는 128개의 문자만 사용할 수 있습니다. 그런데 한글도 써야 하고 여러 다른 문자들도 써야 하는데 1바이트는 너무 부족해서 한 바이트를 더 추가해서 총 2바이트로 문자 집합을 구성하고 ISO-2200에 멀티바이트라고 정의하게 되었습니다. 
멀티바이트는 2바이트 문자 집합(2바이트 이상도 있으나 대부분 2바이트라니 가볍게 넘어가자) 싱글바이트는 1바이트 문자 집합으로 이해할 수 있겠습니다. 

그럼 유니코드는?? 유니코드는 처음부터 2바이트 문자열로 컴퓨터에서 사용하는 모든 문자를 포함하도록 만들어졌다고 하니 구분하자면 멀티바이트 문자집합이라고 해야겠네요. 그렇다면 왜 Visual studio에서는 단일바이트 문자집합과 멀티바이트 문자집합 둘 중 하나를 선택하라고 할까요? 
여기서 혼란이 오는데 지금까지 읽어본 내용들을 종합해보면 MBCS은 유니코드처럼 2바이트 이상의 문자 집합이긴하나 세계 표준으로 합의가 이루어지지 않은 윈도우에서 개발된 코드라서 코드 자체에 차이가 있는 것 같습니다.

유니코드와 멀티바이트의 사용

visual studio에서 개발 시 SBCS을 쓸 건지 MBCS을 쓸 건지 기본값을 정해야 하고 그리고 유니코드인지 아닌지에 따라 코딩을 해주어야 합니다. 
유니코드 문자열을 문자열을 따옴표로 감싸고 그 앞에 L을 붙여서 (L”   ”) 사용하고 멀티바이트는 “ “로만 사용 됩니다. 그리고 유니코드로 개발된 프로그램을 멀티바이트로 이식하려면 이들 문자열의 표현 방식을 다 고쳐줘야 하는 불편함이 있다. 그래서 이를 해결해주기 위해 "_T 매크로"가 사용됩니다.

문자열을 따옴표로 감싸고 유니코드에서 사용한 'L'대신 '_T'를 사용하게 되면 매크로가 알아서 개발 환경에 맞게 변형되어 컴파일 될 수 있도록 해줍니다.


728x90

댓글0