3.3 字符

Racket 字符 与 Unicode 标量值(Scalar Value)相对应。 大致上来来说,标量值就是个可以用 21 个二进制位表示的无符号整数, 只是它被映射到了自然语言字符或字符部分的概念上来。从技术上来说,标量值的概念比 Unicode 标准中名为“字符”概念还要简单,但就很多目的而言,这种近似可以做得相当不错了。 例如,带变音符号的罗马字母可以表示为标量值,任何普通的中文字符也都可以。

尽管每个 Racket 字符都对应一个整数,然而字符数据类型却不同于数值类型。 过程 char->integerinteger->char 可用于在标量值和与之对应的字符之间转换。

可打印的字符通常会打印成 #\ 后跟该字符的表示。 不可打印的字符通常会打印成 #\u 后跟其十六进制数值形式的标量值。 还有些字符会打印为专有的形式,例如,空格符和换行符会分别打印为 #\space#\newline

+The Racket ReferenceReading Characters一节中阐述了字符语法的要点。

例如:
> (integer->char 65)

#\A

> (char->integer #\A)

65

> #\λ

#\λ

> #\u03BB

#\λ

> (integer->char 17)

#\u0011

> (char->integer #\space)

32

与用于打印字符结果的字符常量语法相反,过程 display 会直接将字符写到当前的输出端口中(见 Input and Output)。

例如:
> #\A

#\A

> (display #\A)

A

Racket 提供了一些关于字符的分类和转换过程。然而需要注意,某些 Unicode 的转换只有在字符串中时才能按照人们的预期来工作(例如,将 “ß” 转为大写,或将 “Σ” 转为小写)。

例如:
> (char-alphabetic? #\A)

#t

> (char-numeric? #\0)

#t

> (char-whitespace? #\newline)

#t

> (char-downcase #\A)

#\a

> (char-upcase #\ß)

#\ß

过程 char=? 用于比较两个或更多字符,char-ci=? 则用于在忽略大小写的情况下比较字符。过程 eqv?equal? 的行为与 char=? 作用于字符是相同的。如果你想要更加具体地说明要比较的值为字符, 那么请使用 char=?

例如:
> (char=? #\a #\A)

#f

> (char-ci=? #\a #\A)

#t

> (eqv? #\a #\A)

#f

+The Racket ReferenceCharacters一节中提供了关于字符与字符过程的更多信息。