5.4.5 字符
原文链接: https://kotlinlang.org/docs/characters.html
5.4.5 字符
Char 类型以 UTF-16 代码单元的形式表示单个字符。
对单个字符值使用 Char,例如字母、数字、标点符号或空白字符。对于字符序列,请使用 String。
提示: Char 不是数值类型,但每个字符都有一个可以访问的 Unicode 数值。参见字符转换。
语法
要声明一个字符,请把值放在单引号(' ')中。你可以显式指定 Char 类型,也可以让 Kotlin 根据值推断:
1
2
3
4
5
6
7
| val letter: Char = 'a'
// Kotlin infers Char because the values are written in single quotes
val digit = '1'
val symbol = '!'
val space = ' '
val separator = ':'
|
字符字面量必须恰好包含一个字符,否则 Kotlin 编译器会报错:
1
2
| val invalid = 'AB' // Error
val invalidEmpty = '' // Error
|
可空值
要存储可空值,请使用 Char?:
1
| val maybeAbsent: Char? = null
|
注意: 在 JVM 上,可空的 Char 值会在需要时被装箱。数值类型也是如此。
Unicode 支持
Kotlin 以 UTF-16 代码单元表示 Char 值。这意味着单个 Char 存储一个 UTF-16 代码单元,而不一定是完整的 Unicode 字符。
基本多文种平面
单个 Char 可以存储 \u0000 到 \uFFFF 范围内的值。这个范围覆盖了基本多文种平面(BMP),其中包含几乎所有现代语言的字符以及大量符号。
要通过 Unicode 值指定字符,请使用 \u 加上Unicode 表中的四位十六进制值:
1
| val unicodeNumber = '\u0031' // Equals '1'
|
补充字符
BMP 之外的 Unicode 字符(例如 emoji 和一些古代文字)无法用单个 Char 表示。在 UTF-16 中,它们被编码为一个代理对,即两个 Char 值一起表示 String 中的一个 Unicode 字符:
1
2
3
4
5
6
7
| fun main() {
val emoji = "🥦"
println(emoji.length) // 2
println(emoji[0]) // First surrogate
println(emoji[1]) // Second surrogate
}
|
提示: 要单独处理 32 位符号,请使用存储为 Int 值的 Unicode 码点。
转义序列
对于难以直接在源码中书写、或者具有特殊含义的字符,请使用转义序列。
每个转义序列都以反斜杠(\)开头。
| 支持的序列 | 说明 |
| \t | 制表符 |
| \b | 退格 |
| \n | 换行(LF) |
| \r | 回车(CR) |
| \' | 单引号 |
| \" | 双引号 |
| \\ | 反斜杠 |
| \$ | 美元符号 |
例如:
1
2
3
| val newLine = '\n'
val dollar = '\$'
val backslash = '\\'
|
操作
Char 支持比较、检查、大小写转换以及显式的数值转换。
字符比较
要比较 Char 值,请使用标准比较运算符,例如 ==、!=、<、>、<= 和 >=。
Kotlin 按字符的 Unicode 数值比较 Char 值,并返回一个 Boolean 值:
1
2
3
4
| val before = 'a' < 'b' // true
val after = 'c' > 'd' // false
val different = 'A' == 'a' // false
val equal = 'A' == 'A' // true
|
字符处理
Kotlin 提供了一些用于检查字符值和转换大小写的函数。例如:
1
2
3
4
5
6
7
8
9
| fun main() {
val myChar = 'A'
// Checks if the character represents a digit
println(myChar.isDigit()) // false
// Checks if the character represents an uppercase letter
println(myChar.isUpperCase()) // true
// Returns a lowercase version
println(myChar.lowercaseChar()) // 'a'
}
|
注意: 可用函数的更多内容请参阅 API 参考。
字符运算
你可以通过加上或减去一个整数来得到另一个字符值:
1
2
3
4
5
6
7
| fun main() {
val a = 'a'
println(a + 1) // b
println(a + 2) // c
println(a - 32) // A
}
|
注意: 这些运算遵循 Unicode 数值,而不是特定语言的字母表规则。
你也可以对可变变量使用前缀和后缀形式的自增(++)与自减(--)运算符:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| fun main() {
var a = 'A'
a += 10
println(a) // 'K'
println(++a) // 'L' prefix increment
println(a++) // 'L' postfix increment
println(a) // 'M'
println(--a) // 'L' prefix decrement
println(a--) // 'L' postfix decrement
println(a) // 'K'
}
|
字符转换
要把 Char 转换为数值类型,请使用显式转换:
- 使用
.code 获取字符的 Unicode 数值:
1
2
3
4
| fun main() {
val letter = 'A'
println(letter.code) // 65
}
|
- 如果字符表示十进制数字,请使用
digitToInt():
1
2
3
4
| fun main() {
val digit = '7'
println(digit.digitToInt()) // 7
}
|
提示: 如果字符可能不是有效的数字,请使用 digitToIntOrNull()。