Learn Rust Coding · 课时

UTF-8 与字符

处理 Unicode

第 4 / 4 课13 个步骤

UTF-8 与字符 是 CoddyKit 上的免费 Learn Rust Coding 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn Rust Coding 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn Rust Coding 课程共包含 4 节课。

Rust 字符串采用 UTF-8

每个 Rust String 和 &str 都以 UTF-8 编码。这意味着文本可以包含任何 Unicode 字符,而不仅仅是 ASCII。

fn main() {
    let s = String::from("caf\u{e9}");
    println!("{}", s);
}

什么是 UTF-8

UTF-8 使用一到四个字节编码每个 Unicode 字符;ASCII 字符使用一个字节,带重音符号的字母和表情符号则使用更多字节。

fn main() {
    let ascii = "A";          // 1 byte
    let accent = "\u{e9}";    // 2 bytes (e-acute)
    println!("{} bytes vs {} bytes", ascii.len(), accent.len());
}

字节与字符

由于采用多字节编码,len() 返回的是字节数,而字符数可能更少。

fn main() {
    let s = "caf\u{e9}";
    println!("bytes {}", s.len());
    println!("chars {}", s.chars().count());
}

char 类型是 Unicode

Rust 的 char 是一个 4 字节值,可以容纳任意 Unicode 标量值,远不止一个字节所能表示的范围。

fn main() {
    let letter = 'Z';
    let accented = '\u{f1}'; // n with tilde
    println!("{} {}", letter, accented);
}

迭代字符

使用 chars() 按字符遍历文本。它可以正确处理多字节字符。

fn main() {
    let s = "a\u{e9}z";
    for c in s.chars() {
        println!("{}", c);
    }
}

为什么不能按数字索引

Rust不允许对字符串使用 s[0]。由于字符占用的字节数不同,按单个数字进行索引会产生歧义,也不安全。

fn main() {
    let s = "hello";
    // let c = s[0]; // error: cannot index a str
    let first = s.chars().next().unwrap();
    println!("{}", first);
}

获取第 nth 个字符

使用迭代器方法 nth 按位置获取字符。它会返回一个 Option。

fn main() {
    let s = "abcdef";
    let third = s.chars().nth(2);
    println!("{:?}", third);
}

迭代字节

确实需要原始字节时,请使用 bytes(),它会生成 u8 值。

fn main() {
    let s = "AB";
    for b in s.bytes() {
        println!("{}", b);
    }
}

在字节边界上切片

字符串切片使用字节索引。切片必须落在有效的字符边界上,否则程序会崩溃。

fn main() {
    let s = "hello";
    let part = &s[0..3]; // valid ASCII boundary
    println!("{}", part);
}

char 方法

char 类型提供了一些实用方法,例如 is_alphabetic、is_numeric 和 to_uppercase。

fn main() {
    let c = 'k';
    println!("alpha {} numeric {}", c.is_alphabetic(), c.is_numeric());
    println!("upper {}", c.to_uppercase());
}

统计特定字符

将 chars 与 filter 结合,即可统计符合某个条件的字符。

fn main() {
    let s = "banana";
    let a_count = s.chars().filter(|&c| c == 'a').count();
    println!("a appears {} times", a_count);
}

快速检查

回顾字符串长度为什么可能与您的预期不同。

总结

Rust 中的 UTF-8 与 chars:

  • 字符串采用 UTF-8 编码;字符使用 1 到 4 个字节。
  • len() 返回字节数;chars().count() 返回字符数。
  • 不能按数字索引字符串;请使用 chars() 或 nth。
  • 切片必须落在字符边界上。
fn main() {
    let s = "sm\u{ee}le";
    println!("bytes {} chars {}", s.len(), s.chars().count());
    for c in s.chars() {
        print!("{} ", c);
    }
    println!();
}
免费开始

用 AI 导师学习 Rust — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
39
课程
144

常见问题解答

「UTF-8 与字符」课时是免费的吗?

是的 — 「UTF-8 与字符」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn Rust Coding 课程的其余内容,请升级到 CoddyKit PRO。 Learn Rust Coding 课程共包含 4 节课。

「UTF-8 与字符」这节课中我会学到什么?

处理 Unicode 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Learn Rust Coding 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Learn Rust Coding 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「UTF-8 与字符」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Learn Rust Coding 课中编写并运行代码吗?

能。每节 Learn Rust Coding 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. String 与 &str 的区别
  2. 切片
  3. 字符串方法
  4. UTF-8 与字符
← 返回 Learn Rust Coding