琉离铟落的小窝琉离铟落的小窝
← 返回文章列表
2026-06-24
#Cangjie#入门教程

字符串型

仓颉的基本数据类型

2.4.1 什么是字符串?

字符串String)就是一串字符的组合,用来表示文本数据。你可以把它理解为"多个 Rune 连在一起"。

Cangjie
let greeting: String = "你好,仓颉"

2.4.2 字符串字面量

仓颉有三种字符串写法:

1. 单行字符串

用一对单引号 '...' 或双引号 "..." 包裹,只能写在一行内

Cangjie
let s1: String = ""                     // 空字符串
let s2 = 'Hello Cangjie Lang'           // 单引号
let s3 = "\"Hello Cangjie Lang\""       // 双引号内用转义的双引号
let s4 = 'Hello Cangjie Lang\n'         // 支持转义字符
ℹ️NOTE

单行字符串中不能直接换行,也不能出现未转义的、与外层相同的引号。

2. 多行字符串

用三个引号 """..."""'''...''' 包裹,可以跨越多行

Cangjie
let s1: String = """
    """
let s2 = '''
    Hello,
    Cangjie Lang'''

s2的输出结果是

bash
    Hello,
    Cangjie Lang
[!IMPORTANTP]
多行字符串会保留里面的换行和缩进,所以格式会原样输出。

3. 多行原始字符串

# 加引号开头,不处理转义字符——写什么就是什么:

Cangjie
let s1: String = #""#                        // 空字符串
let s2 = ##'#'\n'##                          // 输出:#'\n(\n 不会转义为换行)
let s3 = ###"
    Hello,
    Cangjie
    Lang"###                                  // 换行和缩进会被保留

输出结果

Bash
#'\n

        Hello,
        Cangjie
        Lang

# 的数量决定了结束标记:开头有几个 #,结尾也要有几个 # 配对。

IMPORTANT

原始字符串与普通字符串的核心区别:\n\t 等转义序列不会被转义,而是原样保留。


2.4.3 字符串自动转换为 Byte / Rune

当赋值给 Byte(即 UInt8)或 Rune 类型的变量时,单字符字符串会自动转换:

Cangjie
main() {
    var b: Byte = "0"    // "0" 的 ASCII 码是 48,自动转为 Byte
    print(b)             // 输出 48
    b = "1"              // "1" 的 ASCII 码是 49
    print(b)             // 输出 49
    var r: Rune = "0"    // "0" 自动转为 Rune 字符
    print(r)             // 输出 0
    r = "1"
    print(r)             // 输出 1
}

运行结果:

Bash
484901
ℹ️NOTE

Byte 转换取的是 ASCII 编码值,所以 "0" 变成 48 而不是 0。


2.4.4 插值字符串

插值字符串可以在字符串中直接嵌入变量或表达式,用 ${} 包裹,前面加 $

Cangjie
main() {
    let fruit = "apples"
    let count = 10
    let s = "There are ${count * count} ${fruit}"
    println(s)

    let r = 2.4
    let area = "The area of a circle with radius ${r} is ${let PI = 3.141592; PI * r * r}"
    println(area)
}

运行结果:

Bash
There are 100 apples
The area of a circle with radius 2.400000 is 18.095570
💡TIP
  • 最常用的写法是 "${变量名}",如 "${count}"
  • ${} 里可以写表达式,如 ${count * count}
  • 甚至可以在 {} 里声明变量,如 ${let PI = 3.14; PI * r * r}
  • 插值字符串不适用于多行原始字符串

2.4.5 小结

类型 写法 特点
单行字符串 '...'"..." 只能一行,支持转义
多行字符串 '''...'''"""...""" 可跨行,支持转义
多行原始字符串 #'...'##"..."# 可跨行,不转义,写什么就是什么
插值字符串 "${表达式}" 在字符串中嵌入变量或表达式

2.。4.6 常见问题

Q1:单引号和双引号有什么区别?

在仓颉没有区别,效果完全一样。你可以自由选择,只要前后配对就行:

Cangjie
let s1 = "Hello"
let s2 = 'Hello'    // 效果一样

Q2:多行字符串的缩进会保留吗?

会的!多行字符串会原样保留所有的换行和空格/制表符。所以你在代码里写的缩进,输出时也会出现:

Cangjie
let s = '''
    第一行
        第二行(缩进更多)
    第三行'''

输出结果:

code
    第一行
        第二行(缩进更多)
    第三行

如果你不想要前面的缩进,可以把引号放在行首。

Q3:原始字符串的 `#` 怎么确定数量?

规则很简单:开头有几个 #,结尾也要有几个 #。如果你要写的文字本身包含 #"#,那就用两个 ## 包起来:

Cangjie
let s = #"他说:"你好啊""#       // 一个 # 就够了
let t = ##"这里有个 #"号"##      // 文字里有 #",所以用两个 ## 包
💡TIP

大多数时候用一个 # 就够了,只有文字里出现 #"#' 时才需要增加数量。