#include <stdio.h>
int main()
{
char chars[] = "가나다라마바사";
char a;
int i = 0;
for(i = 0; i < sizeof(chars) / sizeof(char); i++)
{
a = chars[i];
printf("%c", a);
}
return 0;
}
이렇게 생긴 코드가 있다.
출력값은 "가나다라마바사" 이다.
char에 1바이트만 저장되는 줄 알았는데 왜 값이 다 출력되지 싶어서 i 값을 같이 출력해 보기로 했다.
#include <stdio.h>
int main()
{
char chars[] = "가나다라마바사";
char a;
int i = 0;
for(i = 0; i < sizeof(chars) / sizeof(char); i++)
{
a = chars[i];
printf("%c%d", a, i);
}
return 0;
}
(printf 함수에 %d로 i를 출력하는 내용이 추가되었다)
그러고 나니까 출력값이 신기하게 나왔다.
�0�1�2�3�4�5�6�7�8�9�10�11�12�13�14�15�16�17�18�19�2021
이거는 왜 안되지 생각하면서 별 생쇼를 다 해봤는데 그건 생략하도록 하자.
어쨌든 답은 그거였다.
분명 루프는 0에서 21까지 22번 다 돌고 있었다!
utf-8에서 한글은 3byte니까 '가' 한글자가 0 1 2번을 차지하고 있었던 것이다.
그렇게 마지막 코드를 실행했다.
#include <stdio.h>
int main()
{
char chars[] = "가나다라마바사";
char a;
int i = 0;
printf("%c", chars[0]);
printf("%c", chars[1]);
printf("%c", chars[5]);
for(i = 0; i < sizeof(chars) / sizeof(char); i++)
{
a = chars[i];
printf("%c", a);
}
return 0;
}
위쪽에서 따로 printf를 불러서 0 1 5 먼저 출력해보고 반복하는 코드다.
���가나다라마바사
이렇게 나오겠거니 하면서 실행해 보니까
갘가나다라마바사
출력값이 이렇게 나왔다.
'가' 가 EA B0 80
'나' 가 EB 82 98 인데 0, 1, 5라는 건 가에서 1번, 2번 바이트를 받고 나에서 3번 바이트를 받아서
EA B0 98 '갘'이 된다.
오늘의 결론.
Ascii 값이 아닌 글자는 printf에 char 하나씩 넣어서 합체시켜서 만들어진다.
AC00은 utf-16용이다.
그래서 한글 검사는 어떻게 하는건데..