跳转至

字符串字面量、字符字面量

开头和结尾

  • ' 字符字面量
  • " 字符串字面量
  • ` 格式化字符串字面量
  • ''' 原始字符串字面量
  • """ 多行字符串字面量
  • ``` 多行格式化字符串字面量

反斜杠转义

使用反斜杠进行转义,转义序列均使用小写字母表示。
除原始字符串字面量外都可以使用转义

原始 字符 八进制 十六进制 解释
\0 NUL 000 00 字符串结束
\a BEL 007 07 响铃
\b BS 010 08 退格
\e ESC 033 1b 转义
\f FF 014 0c 换页
\n LF 012 0a 换行
\r CR 015 0d 回车
\t TAB 011 09 水平制表符
\v VT 013 0b 垂直制表符
\x - - - 十六进制转义
\u - - - Unicode 转义
\\ \ 134 5c 反斜杠
\' ' 047 27 单引号
\" " 042 22 双引号
\` ` 140 60 反引号
\$ $ 044 24 美元符号
  • \000 八进制转义 (三位八进制数,可省略前导0)
    如:\0 表示空字符,\033 表示 ESC
  • \x00 十六进制转义 (两位十六进制数)
    如:\x20 表示空格,\x1b 表示 ESC
  • \u0000 Unicode 转义 (四位十六进制数)
    如:\u0020 表示空格,\u001b 表示 ESC

\ 加其它字符则忽略 \ 本身,其后的字符直接以原始字符的形式加入字符串,如 \' 表示 ' 字符。
不过我们默认只允许用 \\ \' \" \` $ 这几种转义来表示原始字符,其它的字符会导致报错。

\ 后添加括号来插入 Unicode 码点,例如 \[1f600] 表示 😀 字符。
四种括号形式均可使用:()[]{}<>
数字使用十六进制表示,长度不限,可以有前导零。

字符串前缀

字符串前缀用于表示字符串的类型,前缀后接字符串字面量。

  • 无前缀,默认为 UTF-8 编码字符串,但如果内部包含无效的 UTF-8 序列则报错
    • u8 UTF-8 编码字符串
    • u16 UTF-16 编码字符串
    • u32 UTF-32 编码字符串
  • c C 风格字符串(以空字符 \0 结尾)
    • c8 UTF-8 编码 C 风格字符串
    • c16 UTF-16 编码 C 风格字符串
    • c32 UTF-32 编码 C 风格字符串
  • r 正则表达式
    • r8 UTF-8 编码正则表达式
    • r16 UTF-16 编码正则表达式
    • r32 UTF-32 编码正则表达式
  • b 字节串(支持格式化表达式)
    • b8 UTF-8 编码字节串
    • b16 UTF-16 编码字节串
    • b32 UTF-32 编码字节串
  • h 十六进制字节串(每两个十六进制字符表示一个字节)
  • 任意编码标识符 自定义编码字符串(如 gbkshift_jis 等)

格式化表达式

使用类似 shell 的格式化写法,使用 $变量名 ${表达式} $表达式%格式修饰符 ${表达式}%格式修饰符 四种形式。
与其它情况下大括号表示代码块不同,此处大括号内为单个表达式,表达式也不可以换行。

`$a + $b = ${a + b}`
`Pointer ptr is: $ptr%p`

要在格式化字符串中表示 $ 可以使用 $$ 进行转义。

`The price of $item is $$5.00`

非法的序列中 $ 会被保留。

`$ $ $`

格式修饰符

格式修饰符以 % 开头,后接修饰符序列。

修饰符 说明
d 十进制整数
x 十六进制整数(小写字母)
X 十六进制整数(大写字母)
o 八进制整数
b 二进制整数
f 浮点数(默认小数点后 6 位)
e 科学计数法表示的浮点数(小写字母 e)
E 科学计数法表示的浮点数(大写字母 E)
g 根据数值大小自动选择 %f%e 格式
G 根据数值大小自动选择 %f%E 格式
s 字符串
c 字符
p 指针地址(通常以十六进制表示)

原始字符串

原始字符串以 ''' 开头和结尾,开头的 ''' 后必须换行,结尾的 ''' 前必须换行。
原始字符串中不能使用转义序列。
开头的 ''' 后可以直接连接一个标识符,这样结尾的 ''' 后也必须直接连接相同的标识符。
这可以用于防止字符串中出现的 ''' 被误认为是字符串结尾。

直接书写多行内容:

'''
line1
line2
line3
'''

使用自定义标识符:

'''RAW_STR
This is a raw string.
It can contain ''' without ending the string.
'''RAW_STR

多行字符串

多行字符串和单行字符串类似,只是使用 """``` 包裹字符串。

新行以 | 开头,续行以 + 开头,添加空格并续行以 * 开头,其后均必须加一个空格,否则会导致词法错误。

单个 | 表示空行,其后无需加空格。

""" | line1
    | line2
    | line3
"""

使用 + 时需要多打一个空格来使单词之间分割,但使用 * 时不需要。

""" | This is the
    +  first line.
    | This is the second line.
"""
""" | This is the
    * first line.
    | This is the second line.
"""

以上两个均被解析为:

This is the first line.
This is the second line.

也可以正常使用格式化表达式。

``` | $a + $b = ${a + b}
    | $c + $d = ${c + d}
```

多行字符串必须跨行