왜 한글이 프로그램 코딩할 때 오류가 많이 발생할까?
코딩 중 한글인식오류로 인해 골머리를 앓았던 적이 있을 것이다. 오류의 원인과 해결법을 찾아보면 utf-8 포맷 또는 영어를 반영하라는 글이 대다수 일 것이다. 물론 앞서 언급한 두 가지 방식이 해결점이 될 수 있지만, 무엇보다 중요한 건 영어와 한글 입력 방식이 어떻게 다르고 작동하는가에 대해 알아야 하는 것이 급선무라고 생각이 된다. 따라서 프로그램 코딩 시 한글과 영어와 어떻게 작동하는지 코드와 간략한 설명을 통해 나타내고자 한다.
작동 원리 및 설명
아스키코드와 유니코드의 혼용
#include<stdio.h>
int main(){
char str[] = "abc한글";
int size = sizeof(str);
int len = strlen(str);
printf("배열 크기 %d", size); // "배열 크기 8"
printf("문자열 길이 %d", len); // "문자열 길이 7"
return 0;
}
한/영 입력 코드
출력 결과를 보면 배열크기 8과 문자열 길이 7이 나오는 것을 볼 수 있다. 보통의 경우(아스키 기준) 다음과 같을 것이다.
<예상>(올바르지 않은 예)
배열 크기 ==> 6개
문자열 길이 ==> 5개
<결과>
배열 크기 ==> 8개
문자열 길이 ==> 7개
"어떻게 이런 결과가 나온 것일까?"라는 의문을 가진 사람이 많을 것이다. 이유를 결론적으로 말하자면 아스키코드(영문)와 유니코드(한글)로 볼 수 있다. 아스키코드와 유니코드는 동작 방식이 다른 것이었다. 모든 것을 먼저 개발된 아스키코드로 표현하면 이러한 상황은 발생하지 않았겠지만, 아스키코드가 1byte(127개)를 기반으로 사용되므로 모든 글자를 표현하기 위해서는 제약이 따랐다. 따라서 이러한 제약을 극복하고 많은 문자를 사용할 수 있도록 제공하는 것으로 나온 것이 유니코드다. 1byte인 아스키코드와는 달리 유니코드는 2byte로 사용이 되며, 이는 위와 같은 결과를 나타낸다.
즉, 쉽게 말하면 다음과 같다. 한글은 2byte로 인식하고 영어는 1byte로 인식하는 것이다.
따라서 "abc한글" 영어(1byte) x 3 , 한글(2byte) x 2를 통해 배열의 길이(nul값 개수 포함)는 8 문자열 길이는 7이 된다.
유니코드식 표현
#include<stdio.h>
int main(void){
wcahr_tstr[] = L"ABC한글";
int size = sizeof(str);
int len = wcslen(str);
printf("배열 크기 %d", size) // 배열 크기 12
printf("문자열 길이 %d", len) // 문자열 길이 5
return 0;
}
현실적으로 보면 "ABC한글"의 문자열 길이는 7개가 아니고 5개로 나와야 한다. 이를 구현하기 위해서는 모든 글자를 유니코드만으로 바꿔줘야 한다. 모든 글자를 유니코드로 바꾸게 되면 아스키코드와 혼용한 표현식과는 달리 사람이 직접 헤아릴 수 있는 5개로 나타낼 수 있다. 유니코드를 인식할 수 있게 하는 표현식은 선언 시 L"글자" 형식을 지키면 된다.
결론
한글과 영어 표현식은 아스키코드와 유니코드의 차이로 다른 게 작동되었던 것을 알 수 있다. 물론 영어 또한 유니코드로 표현이 가능하다 절대 영어는 아스키코드만 된다는 이야기가 아니다. 앞으로 유니코드와 아스키코드의 혼용방식으로 문자열에 대해 골머리를 앓았다면 아스키코드와 유니코드의 작동방식을 통해 문제를 해결해나갈 수 있을 것이다.
윈도우즈 시스템 프로그래밍을 위주로 공부해 나가는 중이고, 제가 느끼고 새롭게 알게 된 부분을 저의 방식으로 요약 및 정리하고 있습니다. 잘못된 내용이 있으면 댓글로 남겨주세요.

참고
뇌를 자극하는 윈도우즈 시스템 프로그래밍 - 한빛미디어