# 字符 [Char](https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-char/) 类型使用 1 个 UTF-16 码元(Code Unit), 表示单个字符. `Char` 用于表示单个字符值, 例如字母, 数字, 标点符号, 或空白字符. 对于字符序列, 请使用 [String](strings.html). > **Tip:** > `Char` 不是数值类型, 但每个字符都有一个数值型的 Unicode 值, 可以读取这个值. 详情请参见 [字符转换](#character-conversion). ## 语法 要声明一个字符, 请将值用单引号 (`' '`) 括起. 可以显式指定 `Char` 类型, 也可以让 Kotlin 从值中推断类型: ```KOTLIN val letter: Char = 'a' // Kotlin 推断类型为 Char, 因为值用单引号表达 val digit = '1' val symbol = '!' val space = ' ' val separator = ':' ``` 字符字面值(literal)必须包含恰好一个字符. 否则 Kotlin 编译器会报告错误: ```KOTLIN val invalid = 'AB' // 错误 val invalidEmpty = '' // 错误 ``` ### 可为 null 的值 要存储可为 null 的值, 请使用 `Char?`: ```KOTLIN val maybeAbsent: Char? = null ``` > **Note:** > 在 JVM 平台, 可为 null 的 `Char` 值会在需要的时候被装箱(box). 与 [数值类型](numbers.html#boxing-and-caching-numbers-on-the-jvm) 相同. ## Unicode 支持 Kotlin 将 `Char` 值表示为 UTF-16 码元(Code Unit). 也就是说, 单个 `Char` 存储 1 个 UTF-16 码元(Code Unit), 不一定是一个完整的 Unicode 字符. ### 基本多语言平面(Basic Multilingual Plane) 单个 `Char` 能够存储从 `\u0000` 到 `\uFFFF` 范围内的值. 这个范围覆盖了基本多语言平面(Basic Multilingual Plane, BMP), 包括几乎所有现代语言的字符, 以及大量的符号. 要通过 Unicode 值指定字符, 请使用 `\u`, 加上来自 [Unicode 表](https://www.unicode.org/charts/) 的 4 位 16 进制值: ```KOTLIN val unicodeNumber = '\u0031' // 等于 '1' ``` ### 补充字符 基本多语言平面(Basic Multilingual Plane) 范围之外的 Unicode 字符, 例如表情符号和一些历史文字, 无法用单个 `Char` 表示. 在 UTF-16 中, 它们被编码为 代理对(Surrogate Pair), 也就是在 `String` 中, 使用 2 个 `Char` 值, 共同表示 1 个 Unicode 字符: ```KOTLIN fun main() { //sampleStart val emoji = "🥦" println(emoji.length) // 输出结果为: 2 println(emoji[0]) // 输出结果为: 第 1 个代理字符 println(emoji[1]) // 输出结果为: 第 2 个代理字符 //sampleEnd } ``` > **Tip:** > 要单独处理 32 位符号, 请使用存储为 `Int` 值的 Unicode 码位(Code Point). ## 转义序列 对于难以直接在源代码中写出, 或具有特殊含义的特殊字符, 请使用转义序列. 每个转义序列以反斜线 (`\`) 开头. | 支持的转义序列 | 描述 | | --- | --- | | `\t` | 制表符(Tab) | | `\b` | 退格(Backspace) | | `\n` | 换行(New Line, LF) | | `\r` | 回车(Carriage Return, CR) | | `\'` | 单引号(`'`) | | `\"` | 双引号(`"`) | | `\\` | 反斜线(`\`) | | `\$` | 美元符号(`$`) | 例如: ```KOTLIN val newLine = '\n' val dollar = '\$' val backslash = '\\' ``` ## 操作 `Char` 支持比较, 检查, 大小写转换, 以及显式数值转换. ### 字符比较 要比较 `Char` 值, 请使用标准的 [比较运算符](keyword-reference.html#operators-and-special-symbols), 例如 `==`, `!=`, `<`, `>`, `<=` 和 `>=`. Kotlin 按照字符的数值型 Unicode 值进行比较, 并返回 `Boolean` 值: ```KOTLIN val before = 'a' < 'b' // 结果为: true val after = 'c' > 'd' // 结果为: false val different = 'A' == 'a' // 结果为: false val equal = 'A' == 'A' // 结果为: true ``` ### 字符处理 Kotlin 提供了用于字符值检查和大小写转换的函数. 例如: ```KOTLIN fun main() { //sampleStart val myChar = 'A' // 检查字符是否表示数字 println(myChar.isDigit()) // 输出结果为: false // 检查字符是否表示大写字母 println(myChar.isUpperCase()) // 输出结果为: true // 返回小写版本 println(myChar.lowercaseChar()) // 输出结果为: 'a' //sampleEnd } ``` > **Note:** > 更多可用的函数, 请参见 [API 参考文档](https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-char/). ### 字符的算术运算 可以对字符加减一个整数值, 来得到另一个字符值: ```KOTLIN fun main() { //sampleStart val a = 'a' println(a + 1) // 输出结果为: b println(a + 2) // 输出结果为: c println(a - 32) // 输出结果为: A //sampleEnd } ``` > **Note:** > 这些操作遵循 Unicode 值, 而非特定语言的字母规则. 对可变变量, 也可以使用递增 (`++`) 和递减 (`--`) 运算符的前缀和后缀形式: ```KOTLIN fun main() { //sampleStart var a = 'A' a += 10 println(a) // 输出结果为: 'K' println(++a) // 输出结果为: 'L' 前缀递增 println(a++) // 输出结果为: 'L' 后缀递增 println(a) // 输出结果为: 'M' println(--a) // 输出结果为: 'L' 前缀递减 println(a--) // 输出结果为: 'L' 后缀递减 println(a) // 输出结果为: 'K' //sampleEnd } ``` ### 字符转换 要将 `Char` 转换为数值类型, 请使用显式转换: * 使用 `.code` 得到字符的数值型 Unicode 值: ```KOTLIN fun main() { //sampleStart val letter = 'A' println(letter.code) // 输出结果为: 65 //sampleEnd } ``` * 如果字符表示 10 进制数字, 请使用 `digitToInt()`: ```KOTLIN fun main() { //sampleStart val digit = '7' println(digit.digitToInt()) // 输出结果为: 7 //sampleEnd } ``` > **Tip:** > 如果字符有可能不是有效的数字, 请使用 `digitToIntOrNull()`.