문자 집합과 인코딩(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): 인코딩된 문자 값을 나타내는 리터럴.