문자 집합(Character set)

문자 집합(Character set)

C++ 프로그램을 작성하다 보면 "이 문자는 소스 파일에 써도 되나?", "이 문자는 어떻게 인코딩되지?" 같은 궁금증이 생겨요. 그 기준이 되는 것이 **문자 집합(character set)**이에요. 이 문서는 C++ 표준이 지정하는 여러 문자 집합을 설명해요.

출처: cppreference

본문

번역 문자 집합(Translation character set)

**번역 문자 집합(translation character set)**은 다음 요소들로 구성돼요.

  • Unicode 코드스페이스에서 코드 포인트가 할당된 각 추상 문자.
  • 추상 문자에 할당되지 않은 각 Unicode 스칼라 값에 대한 개별 문자.

번역 문자 집합은 기본 문자 집합과 기본 리터럴 문자 집합(아래 참고)의 초집합(superset)이에요. (C++23부터)

기본 문자 집합(Basic character set)

**기본 문자 집합(basic character set)**은 다음의 96개(C++26 이전) / 99개(C++26부터) 문자로 구성돼요.

코드 유닛 문자 글리프
U+0009 Character tabulation (탭)
U+000B Line tabulation
U+000C Form feed (FF)
U+0020 Space (공백)
U+000A Line feed (LF) new-line
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++26부터 기본 문자 집합에 추가돼요.

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

(C++26부터)

기본 리터럴 문자 집합(Basic literal character set)

**기본 리터럴 문자 집합(basic literal character set)**은 기본 문자 집합의 모든 문자에 다음 제어 문자들을 더한 것이에요.

코드 유닛 문자
U+0000 Null
U+0007 Bell
U+0008 Backspace
U+000D Carriage return (CR)

실행 문자 집합(Execution character set)

**실행 문자 집합(execution character set)**과 **실행 넓은 문자 집합(execution wide-character set)**은 기본 리터럴 문자 집합의 초집합이에요. 실행 문자 집합들의 인코딩과 (있는 경우) 추가 요소들의 집합은 로케일(locale)에 따라 달라져요. 실행 넓은 문자 집합의 각 요소는 개별적인 wchar_t 코드 유닛으로 표현 가능해야 해요.

코드 유닛과 리터럴 인코딩(Code unit and literal encoding)

**코드 유닛(code unit)**은 문자 타입의 정수 값이에요. 다중 문자 리터럴이나 인코딩할 수 없는 문자 리터럴이 아닌 문자 리터럴의 문자, 또는 문자열 리터럴의 문자는, 인코딩 접두사에 따라 정해지는 하나 이상의 코드 유닛 시퀀스로 인코딩돼요. 이것이 바로 각각의 **리터럴 인코딩(literal encoding)**이에요.

리터럴 인코딩, 또는 실행 문자 집합 중 하나의 로케일별 인코딩은, 기본 리터럴 문자 집합의 각 요소를 단일 코드 유닛(음이 아닌 값, 다른 요소의 코드 유닛과 구별됨)으로 인코딩해요. 기본 리터럴 문자 집합에 없는 문자는 둘 이상의 코드 유닛으로 인코딩될 수 있고, 그런 코드 유닛의 값이 기본 리터럴 문자 집합 요소의 코드 유닛 값과 같을 수도 있어요. 실행 문자 집합들의 인코딩은 어떤 리터럴 인코딩과도 무관할 수 있어요.

**일반 리터럴 인코딩(ordinary literal encoding)**은 일반 문자 또는 문자열 리터럴에 적용되는 인코딩이에요. **넓은 리터럴 인코딩(wide literal encoding)**은 넓은 문자 또는 문자열 리터럴에 적용되는 인코딩이에요.

U+0000 NULL 문자는 값 0으로 인코딩돼요. 번역 문자 집합의 다른 어떤 요소도 값 0의 코드 유닛으로 인코딩되지 않아요. 숫자 문자 0(U+0030) 이후의 각 십진 숫자 문자의 코드 유닛 값은 바로 앞의 값보다 1 커야 해요. 그 외의 일반·넓은 리터럴 인코딩은 구현 정의예요.

UTF-8, UTF-16, UTF-32 리터럴의 경우, 번역 문자 집합의 각 문자에 대응하는 UCS 스칼라 값이 ISO/IEC 10646이 각 UCS 인코딩 형식에 대해 지정한 대로 인코딩돼요.

주의할 점(Notes)

일부 문자 집합의 표준 이름이 P2314R4로 C++23에서 바뀌었어요.

새 이름 옛 이름
basic character set basic source character set
basic literal character set basic execution character set, basic execution wide-character set

번역 1단계(translation phase 1)에서 소스 파일(C++23부터는 UTF-8 소스 파일 제외)의 문자를 기본 문자 집합(C++23 이전) / 번역 문자 집합(C++23부터)으로 매핑하는 것은 구현 정의예요. 그래서 구현은 기본 소스 문자가 소스 파일에서 어떻게 표현되는지 문서화할 의무가 있어요.

결함 보고(Defect reports)

이전에 발표된 C++ 표준들에 소급 적용된 동작 변경 결함 보고들이 있어요.

DR 적용 대상 발표 당시 동작 올바른 동작
CWG 788 C++98 실행 문자 집합 멤버의 값이 구현 정의였지만 로케일별이 아니었음 로케일별임
CWG 1796 C++98 기본 실행 (넓은) 문자 집합에서 널 (넓은) 문자의 표현이 모든 비트가 0이었음 값이 0이기만 하면 됨

더 알아보기

  • ASCII 차트: 문자와 코드 포인트 대응표.
  • 인코딩할 수 없는 문자와 리터럴 인코딩에 대한 더 자세한 내용은 문자 리터럴 문서에서 다뤄요.