문자 집합(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 문서를 함께 보면 좋아요.
- 문자·문자열 리터럴의 인코딩 프리픽스 실전은 문자 상수·문자열 리터럴 문서를 참고해요.