3.4 字符串(Unicode)

字符串就是定长的字符数组。它使用双引号打印, 字符串中的双引号和和反斜杠通过反斜杠转义。其它通用的字符串转义也是通用的,包括 换行符 \n、回车符 \r,八进制转义为 \ 后跟三个八进制数字,而十六进制转义则为 \u 后跟四个十六进制数字。 字符串中的不可打印字符通常会在打印时显示为 \u 的形式。

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

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

例如:
> "Apple"

"Apple"

> "\u03BB"

"λ"

> (display "Apple")

Apple

> (display "a \"quoted\" thing")

a "quoted" thing

> (display "two\nlines")

two

lines

> (display "\u03BB")

λ

字符串分为可变的和不可变的两种。直接写成表达式的字符串是不可变的, 而大部分其它字符串都是可变的。过程 make-string 根据给定的长度和可选的填充字符来创建可变字符串。过程 string-ref 根据从零开始的下标来访问字符串中的字符;过程 string-set! 则用于修改可变字符串中的字符。

例如:
> (string-ref "Apple" 0)

#\A

> (define s (make-string 5 #\.))
> s

"....."

> (string-set! s 2 #\λ)
> s

"..λ.."

字符串的排序和大小写转换操作通常与地区无关,也就是说, 它们对于所有用户的行为均相同。一些地区相关的操作允许字符串根据 最终用户的地区进行大小写归一(case-folding)和排序。例如,若你要排序字符串, 请使用 string<?;如果要让排序结果在不同的机器和用户之间保持一致,请使用 string-ci<?;但如果只是为最终用户排序字符串,请使用 string-locale<?string-locale-ci<?

例如:
> (string<? "apple" "Banana")

#f

> (string-ci<? "apple" "Banana")

#t

> (string-upcase "Straße")

"STRASSE"

> (parameterize ([current-locale "C"])
    (string-locale-upcase "Straße"))

"STRAßE"

要使用 ASCII、原始字节序列或将 Unicode 编码/解码为字节序列,请使用 字节串

+The Racket ReferenceStrings一节中提供了关于字符串及其处理的更多信息。