문자 집합(Character set) — C가 쓰는 글자들

문자 집합(Character set) — C가 쓰는 글자들

C 소스 파일에 어떤 글자를 써도 되는 걸까요? 출력물에 어떤 문자를 쓸 수 있을까요? C 표준은 이걸 정확히 규정해요. 소스 코드와 실행 환경에서 쓰는 **기본 문자 집합(basic character set)**을 정의하고, 그것을 넘어서는 문자 인코딩 규칙까지 정리해 두었어요. 이 문서는 C가 전제하는 문자와 그 인코딩의 지도를 펼쳐 보여줘요.

출처: 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++와 달리, **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을 가져요.

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

C++에서는 기본 실행 문자 집합을 기본 리터럴 문자 집합, 기본 실행 와이드 문자 집합이라고도 불러요.

리터럴 인코딩(Literal encodings)

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

기본 실행 문자 집합에 없지만, 일반 문자 상수나 일반 문자열 리터럴에서 단일 바이트로 인코딩되어야 하는 문자들이 있어요 (C23부터).

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

*와이드 리터럴 인코딩(wide literal encoding)*은 L 프리픽스가 붙은 문자 상수나 문자열 리터럴에서 실행 문자 집합의 문자들을 그 값에 대응시키는 구현 정의 매핑이에요. 기본 실행 문자 집합의 모든 값들을 구현 정의 인코딩으로 매핑하는 것을 지원해요. 구현이 __STDC_MB_MIGHT_NEQ_WC__를 정의하지 않으면, 기본 실행 문자 집합 값에 대해 리터럴 인코딩과 동일한 값을 만들어요. 하나 또는 그 이상의 값이 확장 실행 문자 집합의 하나 또는 그 이상의 값으로 매핑될 수 있어요.

  • UTF-8 인코딩은 실행 문자 집합의 문자들을 u8 프리픽스가 붙은 문자 상수나(C23부터) 문자열 리터럴에 매핑하는 데 쓰여요.
  • 구현 정의 인코딩(C23까지)/UTF-16 인코딩(C23부터)은 u 프리픽스가 붙은 문자 상수나 문자열 리터럴에 매핑하는 데 쓰여요.
  • 구현 정의 인코딩(C23까지)/UTF-32 인코딩(C23부터)은 U 프리픽스가 붙은 문자 상수나 문자열 리터럴에 매핑하는 데 쓰여요. (C11부터)

더 알아보기

  • ASCII 전체 표에 대한 ASCII chart 문서를 함께 보면 좋아요.
  • 문자·문자열 리터럴의 인코딩 프리픽스 실전은 문자 상수·문자열 리터럴 문서를 참고해요.