3.4 字符串(Unicode)
字符串就是定长的字符数组。它使用双引号打印, 字符串中的双引号和和反斜杠通过反斜杠转义。其它通用的字符串转义也是通用的,包括 换行符 \n、回车符 \r,八进制转义为 \ 后跟三个八进制数字,而十六进制转义则为 \u 后跟四个十六进制数字。 字符串中的不可打印字符通常会在打印时显示为 \u 的形式。
The Racket Reference的Reading 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 Reference的Strings一节中提供了关于字符串及其处理的更多信息。