String::from() "o" 和 "ó" 的字符串文字长度不同。为什么?

String::from() a string literal differs in length for "o" and "ó". Why?

我正在学习 Rust,我想尝试一下切片,但这让我“发现”字符串文字“o”和“ó”的长度不同。

此代码:

fn main() {
    let o = String::from("o");
    let oo = String::from("ó");

    println!("o length: {}, ó length: {}", o.len(), oo.len());
}

returns:

o length: 1, ó length: 2

结果:

println!("{}", String::from("ó"));
println!("{}", "ó");

一模一样

我问这个是因为我不精通字符串、字符串文字、字节和编码,尤其是 Rust。为什么 o = 1 和 ó = 2 的长度?

String::len() returns 字符串的长度 字节 ,不是字符。 Rust 中的字符串是 UTF-8 编码的,字符 ó 需要两个字节以 UTF-8 编码。

另请注意,有几种用 Unicode 编写 ó 的方法。它有自己的代码点,但还有一个与前一个字符组合的“组合”重音标记。使用该机制编写 ó 将包含两个代码点:o 字符(UTF-8 中的 1 个字节)和组合重音标记(UTF-8 中的 2 个字节),因此您也可以看到 3 个字节的长度。 (Playground example)