|
|
|
|
# Characters
|
|
|
|
|
|
|
|
|
|
A Racket _character_ corresponds to a Unicode _scalar value_. Roughly, a
|
|
|
|
|
scalar value is an unsigned integer whose representation fits into 21
|
|
|
|
|
bits, and that maps to some notion of a natural-language character or
|
|
|
|
|
piece of a character. Technically, a scalar value is a simpler notion
|
|
|
|
|
than the concept called a “character” in the Unicode standard, but it’s
|
|
|
|
|
an approximation that works well for many purposes. For example, any
|
|
|
|
|
accented Roman letter can be represented as a scalar value, as can any
|
|
|
|
|
common Chinese character.
|
|
|
|
|
|
|
|
|
|
Although each Racket character corresponds to an integer, the character
|
|
|
|
|
datatype is separate from numbers. The `char->integer` and
|
|
|
|
|
`integer->char` procedures convert between scalar-value numbers and the
|
|
|
|
|
corresponding character.
|
|
|
|
|
|
|
|
|
|
A printable character normally prints as `#\` followed by the
|
|
|
|
|
represented character. An unprintable character normally prints as `#\u`
|
|
|
|
|
followed by the scalar value as hexadecimal number. A few characters are
|
|
|
|
|
printed specially; for example, the space and linefeed characters print
|
|
|
|
|
as `#\space` and `#\newline`, respectively.
|
|
|
|
|
|
|
|
|
|
> +\[missing\] in \[missing\] documents the fine points of the syntax of
|
|
|
|
|
> characters.
|
|
|
|
|
|
|
|
|
|
Examples:
|
|
|
|
|
|
|
|
|
|
```racket
|
|
|
|
|
> (integer->char 65)
|
|
|
|
|
#\A
|
|
|
|
|
> (char->integer #\A)
|
|
|
|
|
65
|
|
|
|
|
> #\λ
|
|
|
|
|
#\λ
|
|
|
|
|
> #\u03BB
|
|
|
|
|
#\λ
|
|
|
|
|
> (integer->char 17)
|
|
|
|
|
#\u0011
|
|
|
|
|
> (char->integer #\space)
|
|
|
|
|
32
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
The `display` procedure directly writes a character to the current
|
|
|
|
|
output port \(see \[missing\]\), in contrast to the character-constant
|
|
|
|
|
syntax used to print a character result.
|
|
|
|
|
|
|
|
|
|
Examples:
|
|
|
|
|
|
|
|
|
|
```racket
|
|
|
|
|
> #\A
|
|
|
|
|
#\A
|
|
|
|
|
> (display #\A)
|
|
|
|
|
A
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Racket provides several classification and conversion procedures on
|
|
|
|
|
characters. Beware, however, that conversions on some Unicode characters
|
|
|
|
|
work as a human would expect only when they are in a string \(e.g.,
|
|
|
|
|
upcasing “ß” or downcasing “Σ”\).
|
|
|
|
|
|
|
|
|
|
Examples:
|
|
|
|
|
|
|
|
|
|
```racket
|
|
|
|
|
> (char-alphabetic? #\A)
|
|
|
|
|
#t
|
|
|
|
|
> (char-numeric? #\0)
|
|
|
|
|
#t
|
|
|
|
|
> (char-whitespace? #\newline)
|
|
|
|
|
#t
|
|
|
|
|
> (char-downcase #\A)
|
|
|
|
|
#\a
|
|
|
|
|
> (char-upcase #\ß)
|
|
|
|
|
#\ß
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
The `char=?` procedure compares two or more characters, and `char-ci=?`
|
|
|
|
|
compares characters ignoring case. The `eqv?` and `equal?` procedures
|
|
|
|
|
behave the same as `char=?` on characters; use `char=?` when you want to
|
|
|
|
|
more specifically declare that the values being compared are characters.
|
|
|
|
|
|
|
|
|
|
Examples:
|
|
|
|
|
|
|
|
|
|
```racket
|
|
|
|
|
> (char=? #\a #\A)
|
|
|
|
|
#f
|
|
|
|
|
> (char-ci=? #\a #\A)
|
|
|
|
|
#t
|
|
|
|
|
> (eqv? #\a #\A)
|
|
|
|
|
#f
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
> +\[missing\] in \[missing\] provides more on characters and character
|
|
|
|
|
> procedures.
|