Как Rust считает количество вводимых символов из клавиатуры?

use std::io;
fn main() {
    println!("Hello enter your string and i'm count the number of charaster in if.");
    let mut s1 = String::new();
    io::stdin()
        .read_line(&mut s1)
        .expect("Some text...");

    let (s2, len) = calculate_length(s1);

    println!("The length of '{}' is {}.", s2, len);
}

fn calculate_length(s: String) -> (String, String) {
    let length = s.len() - 1; // len() returns the length of a String

    (s, length.to_string())
}

Доброго времени суток, уважаемые пользователи. Подскажите пожалуйста как в Rust происходит счет символов, которые пользователь вводит с клавиатуры? Что нужно изменить в коде чтобы результат выполнения функции calculate_length выводился корректно?


Ответы (2 шт):

Автор решения: vessd

Для строк Rust использует кодировку UTF-8. В этой кодировке кириллица кодируется с помощью 2 байт. Соответственно длинна строки для русских букв будет в 2 раза больше.

Для подсчёта количества символов можно создать итератор по Char и подсчитать в нём количество элементов.

let length = s.trim().chars().count();
→ Ссылка
Автор решения: mzabaluev

Ответ зависит от того, что считать "символом". Итераторы, возвращаемые методами .chars() и .char_indices(), позволяют сосчитать скалярные значения Unicode, из которых состоит строка. Но это не обязательно соответствует количеству графических или логических символов человеческого языка. В стандартной библиотеке нет полной поддержки стандартов Unicode, регламентирующих различные метрики текста, но можно воспользоваться библиотеками расширения из проекта unicode-rs:

→ Ссылка