본문 바로가기

High Level Technique/Window System

SBCS, MBCS, WBCS

SBCS, MBCS, WBCS


이번에는 SBCS, MBCS, WBCS에 대해서 알아보도록 하겠습니다.


SBCS, MBCS, WBCS는 Character Sets라고 불립니다. 간단히 말하자면 약속된 문자의 표현 방법이라고 할 수 있습니다.







Single Byte Character Set


Single Byte Character Set (이하 SBCS)은 문자를 표현하는데 1바이트만 사용하는 방식을 말합니다. 평소 사용되는 문자가 ASCII 코드가 있는데 ASCII 코드가 대표적인 SBCS에 해당합니다.


단순히 ASCII 코드로만 이루어진 문자를 출력하는 것이므로 예제코드는 올리지 않겠습니다.












Multi Byte Character Set


Multi Byte Character Set (이하 MBCS)은 다양한 바이트 수를 이용해서 문자를 표현하는 방법입니다. 어떤 문자는 1바이트로 또 다른 문자는 2바이트로 표현합니다.

쉽게 생각해서 한글은 2바이트 영어는 1바이트로 처리되는 것을 생각하면 됩니다. 하지만 유니코드가 MBCS는 아닙니다.


ASCII 코드가 존재하는 문자는 1바이트로 처리하고 그렇지 않은 문자들은 2바이트로 처리를 합니다. 따라서 코드를 작성할 때 유의해야 하는 부분이 있습니다.




배열 arr에는 k3y6reak한글 이라는 문자가 저장되어 있고, 크기와 길이를 출력하는 프로그램입니다.


size에서는 NULL이 포함되어 나타나기 때문에 영어, 숫자, NULL은 1바이트, 한글은 2바이트로 처리하기 때문에 13과 12가 출력이 된다.


여기서 중요한 부분이 길이를 나타내는 부분인데 실제로 k3y6reak한글 이라는 문자는 10자리입니다. 하지만 한글을 2바이트로 처리하기 때문에 길이가 12가 됩니다.


만약 arr의 내용을 반복문을 이용해서 출력을하는 경우엔 정확한 계산이 필요하게 됩니다.



위에서 보는 것 처럼 strlen(arr)을 이용해서 계산을 컴퓨터가 알아서 하도록 한다면 상관없지만 상수로 10, 11, 12로 반복문을 돌리게 된다면 정확한 출력을 할 수 없습니다.












Wide Byte Character Set


Wide Byte Character Set (이하 WBCS)은 모든 문자를 2바이트로 처리합니다. 유니코드가 WBCS에 해당합니다. 


WBCS 방식으로 처리하고 싶다면 몇 가지 주의사항이 있습니다. 


char 대신에 wchar_t, "k3y6reak한글" 대신에 L"k3y6reak한글" 로 작성을 해야 합니다.




위 코드를 보면 앞서 설명한 것 처럼 L도 붙이고 wchar_t도 사용했습니다. 그런데 strlen()을 이용하려는데 에러가 발생하게 됩니다.

단순히 k3y6reak만 출력을 하는 것이였으면 상관이 없는데 한글이 들어가서 strlen()을 사용하지 못하게 되는 것입니다.



strlen()은 SBCS 함수이기 때문에 한글문자는 카운팅을 하지 못하게 되고, wcslen()은 WBCS 함수이기 때문에 사용이 가능해진 것입니다.






근데 사실 코딩을 많이 해본건 아니지만 wprintf(), printf()를 구별해서 쓸 일이 있나 싶기도 하고, wchar_t와 같은 방식으로 사용하지 않고, TCHAR로 사용하면 된다.



그냥 이런게 있다는 정도만 알면 될 듯 하다.


만약 중요한 이유가 있다면 댓글 부탁 드립니다.!



'High Level Technique > Window System' 카테고리의 다른 글

프로세스  (0) 2016.12.26
명령어, 레지스터의 구성  (0) 2016.09.20
Polymorphic  (0) 2016.09.13
x86 & x64  (1) 2016.09.12
컴퓨터 구조  (0) 2016.08.26