过去,我们只处理一种称为 ASCII 或美国信息交换标准代码的字符集。这里我们用7位来表示128个字符,包括大小写英文字母、数字以及各种标点符号和设备控制字符。因此,世界上的大量人口无法在计算机上使用自己的书写系统。所以为了解决这个问题,发明了Unicode。它是 ASCII 的超集,包含世界书写系统中存在的所有字符,包括重音符号和其他变音符号、制表符和回车符等控制代码,并为每个字符分配一个称为 Unicode 代码点的标准数字,或者在 Go 语言中,符文。符文类型是 int32 的别名。
要点:
- 永远记住一个字符串是一个字节序列而不是一个符文。但是字符串可能包含以 UTF-8 编码的 Unicode 文本,正如我们所知,go 源代码始终编码为 UTF-8,因此不需要以 UTF-8 编码字符串。
- UTF-8 将所有 Unicode 编码在 1 到 4 个字节之间,其中 1 个字节用于 ASCII,其余用于符文。
- ASCII 总共包含 256 个元素。其中 128 是字符,0-127 被标识为代码点。这里的代码点是指代表单个值的元素。
例子:
♄
它是一个十六进制值♄的符文。
符文字面量
它代表一个符文常量,其中一个整数值识别一个 Unicode 代码点。在 Go 语言中,符文字面量表示为用单引号括起来的一个或多个字符,如 ‘g’、’\t’ 等。在单引号之间,您可以放置除换行符和未转义单引号之外的任何字符。在这里,这些单引号字符本身表示给定字符的 Unicode 值,并且带有反斜杠的多字符序列(在多字符序列的开头)以不同的格式对值进行编码。在 rune 字面量,所有以反斜杠开头的序列都是非法的,只有以下单字符转义符在您将它们与反斜杠一起使用时表示特殊值:
Character | Unicode | Description |
---|---|---|
\a | U+0007 | Alert or Bell |
\b | U+0008 | backspace |
\f | U+000C | form feed |
\n | U+000A | line feed or newline |
\r | U+000D | carriage return |
\t | U+0009 | horizontal tab |
\v | U+000b | vertical tab |
\\ | U+005c | backslash |
\’ | U+0027 | single quote |
\” | U+0022 | double quote(legal only in string literals) |
示例 1:
// Simple Go program to illustrate
// how to create a rune
package main
import (
"fmt"
"reflect"
)
func main() {
// Creating a rune
rune1 := 'B'
rune2 := 'g'
rune3 := '\a'
// Displaying rune and its type
fmt.Printf("Rune 1: %c; Unicode: %U; Type: %s", rune1,
rune1, reflect.TypeOf(rune1))
fmt.Printf("\nRune 2: %c; Unicode: %U; Type: %s", rune2,
rune2, reflect.TypeOf(rune2))
fmt.Printf("\nRune 3: Unicode: %U; Type: %s", rune3,
reflect.TypeOf(rune3))
}
输出:
Rune 1: B; Unicode: U+0042; Type: int32
Rune 2: g; Unicode: U+0067; Type: int32
Rune 3: Unicode: U+0007; Type: int32
示例 2:
输出:
Character: ♛, Unicode:U+265B, Position:0
Character: ♠, Unicode:U+2660, Position:1
Character: ♧, Unicode:U+2667, Position:2
Character: ♡, Unicode:U+2661, Position:3
Character: ♬, Unicode:U+266C, Position:4