문자 집합과 인코딩(Character sets and encodings)

문자 집합과 인코딩(Character sets and encodings)

C 프로그램의 소스 파일에는 어떤 글자가 쓰일 수 있고, 그 글자들이 실행 환경에서 어떻게 값으로 매핑되는지가 정해져 있어요. C 표준은 "기본 문자 집합(basic character set)"이라는 최소한의 문자 집합을 정의하고, 여기에 덧붙여 실행 시 기본 문자 집합과 리터럴 인코딩을 규정하죠. 이 개념을 알면 한글처럼 다국어 문자를 다룰 때 값이 어떻게 정해지는지가 명확해져요.

출처: cppreference

본문

기본 문자 집합(Basic character set)

기본 문자 집합 은 다음 95개 문자로 이루어져요.

코드 단위 문자 글리프
U+0009 Character tabulation
U+000B Line tabulation
U+000C Form feed (FF)
U+0020 Space
U+0021 Exclamation mark !
U+0022 Quotation mark "
U+0023 Number sign #
U+0025 Percent sign %
U+0026 Ampersand &
U+0027 Apostrophe '
U+0028 Left parenthesis (
U+0029 Right parenthesis )
U+002A Asterisk *
U+002B Plus sign +
U+002C Comma ,
U+002D Hyphen-minus -
U+002E Full stop .
U+002F Solidus /
U+0030 .. U+0039 Digit zero .. nine 0 1 2 3 4 5 6 7 8 9
U+003A Colon :
U+003B Semicolon ;
U+003C Less-than sign <
U+003D Equals sign =
U+003E Greater-than sign >
U+003F Question mark ?
U+0041 .. U+005A Latin capital letter A .. Z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
U+005B Left square bracket [
U+005C Reverse solidus \
U+005D Right square bracket ]
U+005E Circumflex accent ^
U+005F Low line _
U+0061 .. U+007A Latin small letter a .. z a b c d e f g h i j k l m n o p q r s t u v w x y z
U+007B Left curly bracket {
U+007C Vertical line |
U+007D Right curly bracket }
U+007E Tilde ~

C++와 달리 C의 기본 문자 집합에는 U+000A LINE FEED(LF)가 포함되지 않아요. 그 대신, 소스 파일에서 각 줄의 끝을 나타내는 어떤 방식이 있어야 하고, 표준 문서는 그런 줄 끝 표시를 마치 단일 개행 문자(new-line character)처럼 취급해요.

기본 문자 집합은 기본 소스 문자 집합(basic source character set)이라고도 불러요.

기본 실행 문자 집합(Basic execution character set)

기본 실행 문자 집합 은 기본 문자 집합의 모든 구성원에 다음 문자들을 더한 것이에요.

코드 단위 문자
U+0000 Null
U+0007 Bell
U+0008 Backspace
U+000A Line feed (LF)
U+000D Carriage return (CR)

각 기본 실행 문자 집합에서 구성원들의 값은 음수가 아니고 서로 달라야 해요. 소스·실행 기본 문자 집합 모두에서, 위 십진 숫자 목록에서 0 다음에 오는 각 문자의 값은 이전 문자의 값보다 정확히 1 커야 해요. U+0000 NULL 문자는 값이 0이에요.

기본 실행 문자 집합의 각 구성원은 그 표현이 한 바이트(byte) 안에 들어맞아요.

C++에서는 기본 실행 문자 집합을 기본 리터럴 문자 집합(basic literal character set) 및 기본 실행 와이드 문자 집합(basic execution wide-character set)이라고도 불러요.

리터럴 인코딩(Literal encodings)

리터럴 인코딩(literal encoding)은 실행 문자 집합의 문자들을, 인코딩 접두사가 없는 문자 상수나 문자열 리터럴의 값으로 매핑하는 구현 정의 매핑이에요. 기본 실행 문자 집합의 모든 값들을 구현 정의 인코딩으로 매핑하는 것을 지원하고, 멀티바이트 문자 시퀀스를 포함할 수도 있어요.

다음 문자들은 기본 실행 문자 집합에 없지만, 일반 문자 상수(ordinary character constant)나 일반 문자열 리터럴(ordinary string literal)에서는 단일 바이트로 인코딩돼야 해요.

코드 단위 문자 글리프
U+0024 Dollar Sign $
U+0040 Commercial At @
U+0060 Grave Accent `

(C23부터)

와이드 리터럴 인코딩(wide literal encoding)은 실행 문자 집합의 문자들을 L이 붙은 문자 상수나 문자열 리터럴의 값으로 매핑하는 구현 정의 매핑이에요. 기본 실행 문자 집합의 모든 값들을 구현 정의 인코딩으로 매핑하는 것을 지원해요. 구현이 __STDC_MB_MIGHT_NEQ_WC__를 정의하지 않는다면, 이 매핑은 기본 실행 문자 집합의 모든 값에 대해 리터럴 인코딩과 동일한 값을 만들어 내요. 하나 이상의 값이 확장 실행 문자 집합(extended execution character set)의 하나 이상의 값으로 매핑될 수 있어요.

u8이 붙은 문자 상수 또는 (C23부터) 문자열 리터럴로 실행 문자 집합의 문자를 매핑할 때는 UTF-8 인코딩이 사용돼요.

u가 붙은 문자 상수나 문자열 리터럴로 매핑할 때는 구현 정의 인코딩(C23 이전)/UTF-16 인코딩(C23부터)이 사용돼요. U가 붙은 문자 상수나 문자열 리터럴로 매핑할 때는 구현 정의 인코딩(C23 이전)/UTF-32 인코딩(C23부터)이 사용돼요. (C11부터)

더 알아보기

  • ASCII 차트: 기본 문자 집합이 담고 있는 가장 흔한 문자 코드 표.
  • 문자 상수(Character constant): 인코딩된 문자 값을 나타내는 리터럴.