문자
문자 (Characters)
문자는 Unicode 스칼라 값(scalar value)을 나타내는 Racket의 기본 데이터형이에요. 문자를 만들고, 비교하고, 분류하고, 변환하는 다양한 프로시저를 이 문서에서 설명할게요.
출처: Racket Reference
본문
4.6 문자
The Racket Guide의 문자 문서에서 문자를 소개하고 있어요.
문자는 Unicode 스칼라 값(scalar values)에 걸쳐 있습니다. 여기에는 #x0에서 #x10FFFF 범위의 값이 포함되지만 #xD800에서 #xDFFF는 포함되지 않아요. 스칼라 값은 Unicode 코드 포인트(code points)의 부분집합입니다.
두 문자가 같은 스칼라 값에 해당하면 equal?, eqv?, eq?입니다.
문자 읽기에 대해서는 Reading Characters, 문자 출력에 대해서는 Printing Characters를 참고하세요.
Changed in version 9.0.0.10 of package base: equal?인 문자는 eq?도 되도록 보장함.
4.6.1 문자와 스칼라 값
char?
(char? v) → boolean?
v : any/c
v가 문자이면 #t를, 그렇지 않으면 #f를 반환합니다.
char->integer
(char->integer char) → exact-integer?
char : char?
문자의 코드-포인트 번호를 반환합니다.
예시:
> (char->integer #\A)
65
integer->char
(integer->char k) → char?
k : (and/c exact-integer?
(or/c (integer-in 0 #xD7FF)
(integer-in #xE000 #x10FFFF)))
코드-포인트 번호가 k인 문자를 반환합니다. k가 256보다 작으면 같은 k에 대해 결과는 같은 객체입니다.
예시:
> (integer->char 65)
#\A
char-utf-8-length
(char-utf-8-length char) → (integer-in 1 6)
char : char?
(bytes-length (string->bytes/utf-8 (string char)))과 같은 결과를 만들어 냅니다.
4.6.2 문자 비교
char=?
(char=? char1 char2 ...) → boolean?
char1 : char?
char2 : char?
모든 인자가 eqv?이면 #t를 반환합니다.
예시:
> (char=? #\a #\a)
#t
> (char=? #\a #\A #\a)
#f
Changed in version 7.0.0.13 of package base: 2개 이상뿐 아니라 1개 인자도 허용함.
char<?
(char<? char1 char2 ...) → boolean?
char1 : char?
char2 : char?
인자들이 증가하는 순서로 정렬되어 있으면 #t를, 그렇지 않으면 #f를 반환합니다. 두 문자는 스칼라 값으로 정렬됩니다.
예시:
> (char<? #\A #\a)
#t
> (char<? #\a #\A)
#f
> (char<? #\a #\b #\c)
#t
Changed in version 7.0.0.13 of package base: 2개 이상뿐 아니라 1개 인자도 허용함.
char<=?
(char<=? char1 char2 ...) → boolean?
char1 : char?
char2 : char?
char<?와 같지만, 인자들이 비감소(nondecreasing)인지 확인합니다.
예시:
> (char<=? #\A #\a)
#t
> (char<=? #\a #\A)
#f
> (char<=? #\a #\b #\b)
#t
Changed in version 7.0.0.13 of package base: 2개 이상뿐 아니라 1개 인자도 허용함.
char>?
(char>? char1 char2 ...) → boolean?
char1 : char?
char2 : char?
char<?와 같지만, 인자들이 감소(decreasing)하는지 확인합니다.
예시:
> (char>? #\A #\a)
#f
> (char>? #\a #\A)
#t
> (char>? #\c #\b #\a)
#t
Changed in version 7.0.0.13 of package base: 2개 이상뿐 아니라 1개 인자도 허용함.
char>=?
(char>=? char1 char2 ...) → boolean?
char1 : char?
char2 : char?
char<?와 같지만, 인자들이 비증가(nonincreasing)인지 확인합니다.
예시:
> (char>=? #\A #\a)
#f
> (char>=? #\a #\A)
#t
> (char>=? #\c #\b #\b)
#t
Changed in version 7.0.0.13 of package base: 2개 이상뿐 아니라 1개 인자도 허용함.
char-ci=?
(char-ci=? char1 char2 ...) → boolean?
char1 : char?
char2 : char?
모든 인자가 char-foldcase를 통한 로케일 비의존(locale-insensitive) 케이스-폴딩 후 eqv?이면 #t를 반환합니다.
예시:
> (char-ci=? #\A #\a)
#t
> (char-ci=? #\a #\a #\a)
#t
Changed in version 7.0.0.13 of package base: 2개 이상뿐 아니라 1개 인자도 허용함.
char-ci<?
(char-ci<? char1 char2 ...) → boolean?
char1 : char?
char2 : char?
char<?와 같지만, 각 인자를 먼저 char-foldcase(로케일 비의존)로 케이스-폴딩했을 때 증가하는 순서가 되는지 확인합니다.
예시:
> (char-ci<? #\A #\a)
#f
> (char-ci<? #\a #\b)
#t
> (char-ci<? #\a #\b #\c)
#t
Changed in version 7.0.0.13 of package base: 2개 이상뿐 아니라 1개 인자도 허용함.
char-ci<=?
(char-ci<=? char1 char2 ...) → boolean?
char1 : char?
char2 : char?
char-ci<?와 같지만, 케이스-폴딩 후 인자들이 비감소인지 확인합니다.
예시:
> (char-ci<=? #\A #\a)
#t
> (char-ci<=? #\a #\A)
#t
> (char-ci<=? #\a #\b #\b)
#t
Changed in version 7.0.0.13 of package base: 2개 이상뿐 아니라 1개 인자도 허용함.
char-ci>?
(char-ci>? char1 char2 ...) → boolean?
char1 : char?
char2 : char?
char-ci<?와 같지만, 케이스-폴딩 후 인자들이 감소하는지 확인합니다.
예시:
> (char-ci>? #\A #\a)
#f
> (char-ci>? #\b #\A)
#t
> (char-ci>? #\c #\b #\a)
#t
Changed in version 7.0.0.13 of package base: 2개 이상뿐 아니라 1개 인자도 허용함.
char-ci>=?
(char-ci>=? char1 char2 ...) → boolean?
char1 : char?
char2 : char?
char-ci<?와 같지만, 케이스-폴딩 후 인자들이 비증가인지 확인합니다.
예시:
> (char-ci>=? #\A #\a)
#t
> (char-ci>=? #\a #\A)
#t
> (char-ci>=? #\c #\b #\b)
#t
Changed in version 7.0.0.13 of package base: 2개 이상뿐 아니라 1개 인자도 허용함.
4.6.3 분류 (Classifications)
char-alphabetic?
(char-alphabetic? char) → boolean?
char : char?
char가 Unicode "Alphabetic" 속성을 가지면 #t를 반환합니다.
char-lower-case?
(char-lower-case? char) → boolean?
char : char?
char가 Unicode "Lowercase" 속성을 가지면 #t를 반환합니다.
char-upper-case?
(char-upper-case? char) → boolean?
char : char?
char가 Unicode "Uppercase" 속성을 가지면 #t를 반환합니다.
char-title-case?
(char-title-case? char) → boolean?
char : char?
char의 Unicode 일반 범주(general category)가 Lt이면 #t를, 그렇지 않으면 #f를 반환합니다.
char-numeric?
(char-numeric? char) → boolean?
char : char?
char가 None이 아닌 Unicode "Numeric_Type" 속성 값을 가지면 #t를 반환합니다.
char-symbolic?
(char-symbolic? char) → boolean?
char : char?
char의 Unicode 일반 범주가 Sm, Sc, Sk, 또는 So이면 #t를, 그렇지 않으면 #f를 반환합니다.
char-punctuation?
(char-punctuation? char) → boolean?
char : char?
char의 Unicode 일반 범주가 Pc, Pd, Ps, Pe, Pi, Pf, 또는 Po이면 #t를, 그렇지 않으면 #f를 반환합니다.
char-graphic?
(char-graphic? char) → boolean?
char : char?
char의 Unicode 일반 범주가 Ll, Lm, Lo, Lt, Lu, Nd, Nl, No, Mn, Mc, 또는 Me이면, 또는 다음 중 하나를 char에 적용했을 때 #t가 나오면 #t를 반환합니다: char-alphabetic?, char-numeric?, char-symbolic?, char-punctuation?.
char-whitespace?
(char-whitespace? char) → boolean?
char : char?
char가 Unicode "White_Space" 속성을 가지면 #t를 반환합니다.
char-blank?
(char-blank? char) → boolean?
char : char?
char의 Unicode 일반 범주가 Zs이거나 char가 #\tab이면 #t를 반환합니다. (이들은 가로 공백(horizontal whitespace)에 해당합니다.)
char-iso-control?
(char-iso-control? char) → boolean?
char : char?
char가 #\nul과 #\u001F 사이(경계 포함)이거나 #\rubout과 #\u009F 사이(경계 포함)이면 #t를 반환합니다.
char-extended-pictographic?
(char-extended-pictographic? char) → boolean?
char : char?
char가 Unicode "Extended_Pictographic" 속성을 가지면 #t를 반환합니다.
Added in version 8.6.0.1 of package base.
char-general-category
(char-general-category char) → symbol?
char : char?
문자의 Unicode 일반 범주를 나타내는 심볼을 반환합니다. 값은 'lu, 'll, 'lt, 'lm, 'lo, 'mn, 'mc, 'me, 'nd, 'nl, 'no, 'ps, 'pe, 'pi, 'pf, 'pd, 'pc, 'po, 'sc, 'sm, 'sk, 'so, 'zs, 'zp, 'zl, 'cc, 'cf, 'cs, 'co, 또는 'cn입니다.
char-grapheme-break-property
(char-grapheme-break-property char) → ?
char : char?
char의 Unicode grapheme-break 속성을 반환합니다. 값은 'Other, 'CR, 'LF, 'Control, 'Extend, 'ZWJ, 'Regional_Indicator, 'Prepend, 'SpacingMark, 'L, 'V, 'T, 'LV, 또는 'LVT입니다.
Added in version 8.6.0.1 of package base.
make-known-char-range-list
(make-known-char-range-list)
→ (listof (list/c exact-nonnegative-integer?
exact-nonnegative-integer?
boolean?))
세-원소 리스트들의 리스트를 만들어 냅니다. 각 세-원소 리스트는 Unicode 표준이 문자 속성을 지정하는 연속적인 코드 포인트 집합을 나타냅니다. 각 세-원소 리스트는 정수 두 개와 불리언 하나를 담고 있습니다. 첫 번째 정수는 시작 코드-포인트 값(경계 포함), 두 번째 정수는 끝 코드-포인트 값(경계 포함), 그리고 불리언은 해당 코드-포인트 범위의 모든 문자가 (a) 위의 모든 문자 서술어에 대해 동일한 결과를 갖고, (b) char-downcase, char-upcase, char-titlecase에 대해 유사한 변환(코드-포인트 공간에서 있을 경우 같은 양만큼 이동)을 가지며, (c) 같은 분해-정규화(decomposition-normalization) 동작을 가질 때 #t입니다.
세-원소 리스트들은 전체 결과 리스트에서 나중 리스트가 더 큰 코드-포인트 값을 나타내도록 정렬되고, 모든 세-원소 리스트들은 Unicode가 지정하지 않은 코드-포인트 값 하나 이상만큼 서로 분리됩니다.
4.6.4 문자 변환 (Character Conversions)
char-upcase
(char-upcase char) → char?
char : char?
Unicode가 정의한 1-대-1 코드 포인트 매핑과 일관된 문자를 만들어 냅니다. char에 upcase 매핑이 없으면 char-upcase는 char를 만들어 냅니다.
string-upcase 같은 문자열 프로시저들은, Unicode가 코드 포인트에서 코드-포인트 시퀀스로의 로케일 비의존 매핑을 정의하는 경우(스칼라 값에 대한 1-1 매핑에 더해)를 처리합니다.
예시:
> (char-upcase #\a)
#\A
> (char-upcase #\λ)
#\Λ
> (char-upcase #\space)
#\space
char-downcase
(char-downcase char) → char?
char : char?
char-upcase와 같지만, Unicode downcase 매핑에 대한 것입니다.
예시:
> (char-downcase #\A)
#\a
> (char-downcase #\Λ)
#\λ
> (char-downcase #\space)
#\space
char-titlecase
(char-titlecase char) → char?
char : char?
char-upcase와 같지만, Unicode titlecase 매핑에 대한 것입니다.
예시:
> (char-upcase #\a)
#\A
> (char-upcase #\λ)
#\Λ
> (char-upcase #\space)
#\space
char-foldcase
(char-foldcase char) → char?
char : char?
char-upcase와 같지만, Unicode 케이스-폴딩 매핑에 대한 것입니다.
예시:
> (char-foldcase #\A)
#\a
> (char-foldcase #\Σ)
#\σ
> (char-foldcase #\ς)
#\σ
> (char-foldcase #\space)
#\space
4.6.5 문자 Grapheme-Cluster 스트리밍
char-grapheme-step
(char-grapheme-step char state) → boolean? fixnum?
char : char?
state : fixnum?
코드 포인트들의 시퀀스에 대해 Unicode의 grapheme-cluster 명세를 위한 상태 머신을 인코딩합니다. 시퀀스의 다음 코드 포인트에 대한 문자를 받아 두 값을 반환합니다: 가장 최근에 보고된 종료(또는 스트림 시작) 이후 (단일) grapheme cluster가 종료되었는지 여부와, char-grapheme-step과 다음 문자에 사용할 새 상태.
state 값 0은 초기 상태이거나 새 경계를 향해 대기 중인 문자가 없는 상태를 나타냅니다. 따라서 문자 시퀀스가 소진되었는데 누적된 상태가 0이 아니라면, 스트림의 끝이 마지막 grapheme-cluster 경계 하나를 만듭니다. char-grapheme-step이 첫 번째 결과로 참 값을, 두 번째 결과로 0이 아닌 값을 만들어 내면, 주어진 char는 (Unicode grapheme clustering 규칙에 따라) 다음 grapheme cluster를 향해 대기 중인 유일한 문자이어야 합니다.
char-grapheme-step 프로시저는 임의의 fixnum 상태에 대해 결과를 만들어 내지만, 0이 아닌 상태의 의미는 오직, char-grapheme-step이 만든 그런 상태를 다른 char-grapheme-step 호출에 제공하면 시퀀스에서 grapheme-cluster 경계 탐지를 계속한다는 것만이 지정되어 있습니다.
string-grapheme-span과 string-grapheme-count도 참고하세요.
예시:
> (char-grapheme-step #\a 0)
#f
1
> (let*-values ([(consumed? state) (char-grapheme-step #\a 0)]
[(consumed? state) (char-grapheme-step #\b state)])
(values consumed? state))
#t
1
> (let*-values ([(consumed? state) (char-grapheme-step #\return 0)]
[(consumed? state) (char-grapheme-step #\newline state)])
(values consumed? state))
#t
0
> (let*-values ([(consumed? state) (char-grapheme-step #\a 0)]
[(consumed? state) (char-grapheme-step #\u300 state)])
(values consumed? state))
#f
5
Added in version 8.6.0.2 of package base.