Я изучаю Rust и хотел поэкспериментировать со срезами, но это заставило меня «обнаружить», что строковые литералы «o» и «ó» различаются по длине.
Этот код:
fn main() {
let o = String::from("o");
let oo = String::from("ó");
println!("o length: {}, ó length: {}", o.len(), oo.len());
}
возвращает:
o length: 1, ó length: 2
Результат:
println!("{}", String::from("ó"));
println!("{}", "ó");
Точно такой же.
Я спрашиваю об этом, потому что я не мастер строк, строковых литералов, байтов и кодирования, особенно в Rust. Почему длина о = 1 и о = 2?


String::len() возвращает длину строки в байты, а не символы. Строки в Rust кодируются в UTF-8, а символ ó требует двух байтов для кодирования в UTF-8.
Также обратите внимание, что есть несколько способов написать ó в Unicode. У него есть своя кодовая точка, но есть и «объединяющий» знак ударения, который сочетается с предыдущим символом. Запись ó с использованием этого механизма будет содержать две кодовые точки: символ o (1 байт в UTF-8) и комбинированный знак ударения (2 байта в UTF-8), поэтому вы также можете увидеть длину 3 байта. (Пример детской площадки)