공룡호가 사는 세상 이야기

MFC에서는 모든 문자열 메시지는 CString type로 변환하여 처리해야 한다.
문자열 메시지를 사용하는 Chatting Program에서 채팅 메시지를 전달할 경우,
메시지를 표현하는 Form의 가로크기 (이를테면 ListBox의 width size) 보다 메시지가 길 경우,
적절하게 String을 Cutting해 주어야 하는데, 1byte 문자와 2bytes 한글문자의 판단을 올바로 해 주지 않으면 2bytes를 이용하여 하나의 문자열을 표현하는 Character에서는 오류가 생긴다.

예를 들어,
" abcdef안녕하세요123 " 이라는 문자열이 있다고 가정하고,
이 메시지가 Form크기보다 커져, 11byte번째에서 잘라주어야 한다고 가정한다.
그러나 사실 자세히 보면, 11byte번째는 한글문자 '하'를 표현하는 2개의 byte중 앞쪽 byte를 사용하는 것을 알 수 있다.
따라서, 11byte번째에 강제로 개행을 한다거나 개행문자를 삽입하면 한글문자 '하'는 깨질 수 밖에 없다.

이런경우, 특정부분까지(여기에서는 11바이트) 전송하고 잘라야 할 부분의 byte가 한글인지 판단하여 2바이트씩 잘라주어야 한글이 깨지지 않는다.

한글판단은 어렵지 않다.
USER가 입력할 수 있는 문자들 중 '영문자'와 '특수문자'는 모두 ASCII CODE TABLE에 존재한다. 따라서 양수값으로 모두 존재한다는 의미가 된다.

실제로, 상단에 있는 "abcdef안녕하세요123"을 값으로 하는 Array를 정수로 출력해 보면,
한글이 있는 부분을 제외한 다른 모든 부분은 양수값을 가진다.
한글은 ASCII CODE가 아닌 유니코드 따위를 사용하므로, ASCII CODE TABLE에 존재하지 않는다. 따라서 값은 모두 음수가 출력이 된다.

해당 Byte의 '양/음'을 비교하여 한글을 판단하면 된다.
다음은 채팅 프로그램에서 해당 문자열 메시지를 일정 부분부터 잘라서 전송하는 방법이다.

위의 그림과 같이 메시지가 있다고 가정하고, 처음부터 ~ 2번까지의 크기가 채팅 LIST FORM의 크기라고 가정하자.
그럼 2번까지 무조건 전송하고 나머지를 잘라서 전송하면 되지만 위에서 설명했듯이, 해당 데이터가 한글 데이터일 경우 깨지게 되는 현상이 발생한다.

따라서, 잘라야 할 해당 Byte가 한글을 형성하는 2바이트중의 하나인 부분바이트인지를 판단하여, 적절하게 잘라주면 된다.
하지만 또다른 문제가 발생한다. 잘라내야 하는 부분의 해당 byte가 한글을 형성하는 일부라고 판단되었는데, 이것이 한글의 2bytes중, 전반부 byte인지 후반부 byte인지를 모른다는 점이다.
한글인지 판단은 하였으나, 잘라내야 할지, 잘라내지 말아야 할지 판단해야 하는 문제가 남아있다. 따라서 위 그림에서 3번의 byte가 한글 bytes라면 앞쪽에 위치하는 1, 2번을 보지 않을 수 없다.
알고리즘은 다음과 같다.

if (3 < 0 && 2 < 0 && 1 > 0 ) // 2+3 = 한글
    메시지 += 3;

3번이 한글이라면 2번을 봅니다.
2번도 한글이라면 2+3이 한글일 확률이 있으나, 1번도 음수라면 1번도 한글의 부분 byte이다.
따라서 1번이 양수라면, 2번과 3번을 합하여 하나의 한글을 형성하므로 3번까지 잘라내면 된다.
써놓고 보니 길어졌는데, 간단한 방법이다.

덧붙이자면, ascii code table에 존재하지 않는 한글을 정수값으로 출력하면 음수가 나오는 이유와 음수값의 의미는 무엇을 뜻하는지 아직 잘 모르겠다. -_-;