1. C에서 char형 변수와 ' '로 감싸지는 문자(리터럴)에는 1바이트가 할당됨.
2. 아스키코드에 없는 문자들은 기본적으로 2바이트를 이용하는 유니코드로 표현됨 (이것 또한 인코딩 방식에 따라 달라짐)
3. 따라서 '가', 'あ', '☆' 등등 아스키에 할당되지 않은 문자들을 char형으로 넘겨버리면 오버플로우가 발생하고, 원하는 값을 저장할 수 없음
(추가). 물론 그렇다고 " int a = '가'; " 처럼 저장하는 변수 사이즈를 늘린다고 해결되는 건 아님. 이미 대입되는 데이터가 char형 리터럴이기 때문. C에서 아스키 외 문자를 쓸 거라면 문자열로 관리하는 게 편함.
선 요약: 문자열을 쓰되 조심해야 한다
C에서 아스키 코드에 속하지 않은 문자를 쓰는 건 좀 골치아파.
우선 C 코드에서 문자열 리터럴은 사실상 const char 배열 취급이야. 예를 들어 "hello, world!"는 길이 14짜리 const char 배열 (C 문자열은 끝에 \0을 붙여서 문자열의 끝이란 걸 표시함) 이나 다름없다는 거지.
근데 여기에 아스키 코드에 속하지 않은 문자를 넣으려 하면 문제가, 그런 문자들은 1바이트만 (통상적인 char 크기) 써서 표현하기가 불가능하다는 거야. 윗댓 말대로 이건 인코딩에 따라서 달라지기도 하는데, 예를 들어 윈도우에서 기본으로 쓰이는 CP949 인코딩에선 한글 한 글자가 2바이트로 표현되고 인터넷이나 맥, 리눅스 등에서 쓰이는 UTF-8 인코딩에선 한글 한 글자가 3바이트로 표현돼.
이게 무슨 말이냐면, 우리가 생각하는 한 글자가 C언어의 기준에선 '한 글자'가 아닐 수도 있다는 거야. 예시로 "안"은 C언어의 시각에선 윈도우 기준 길이 3짜리 const char 배열이고, 리눅스 기준으론 무려 길이 4짜리 배열이되는 식이야.
참고로 이건 C언어에서 '안' 이 불가능한 이유기도 해.
그래서 저런 문자를 반드시 써야겠다면 char 하나만 써서는 안 되고, 각각 전용(?) 문자열을 만들어준 뒤에 printf에서 %s로 포맷해 통째로 출력해줘야 해.
문제는 리터럴 안에다가 non-ascii 글자를 썼을 때 어떤 char 배열로 바뀌는지가 소스 파일의 인코딩을 따라간다는 거야 ㅡ.ㅡ 만약 소스코드의 인코딩은 CP949인데 프로그램을 실행하는 터미널이 UTF-8을 사용하도록 설정돼 있다면 이 글자들을 출력해봤자 이상한 글자만 잔뜩 나오겠지. 물론 반대도 마찬가지.
그래서 C에서 non-ascii 문자를 다루려면 이런 지뢰를 조심해서 잘 피해야 원하는 결과를 얻을 수 있어.