Функция from_utf8
Описание
#![allow(unused)] fn main() { pub const fn from_utf8(v: &[u8]) -> Result<&str, Utf8Error> }
Преобразует срез байтов в строковый срез.
Это псевдоним для str::from_utf8.
Строковый срез (&str) состоит из байтов (u8), и срез байтов (&[u8]) также состоит из байтов, поэтому эта функция выполняет преобразование между ними. Однако не все срезы байтов являются корректными строковыми срезами: &str требует, чтобы данные были корректным UTF-8. from_utf8() проверяет, являются ли байты корректным UTF-8, и затем выполняет преобразование.
Если вы уверены, что срез байтов является корректным UTF-8, и не хотите тратить ресурсы на проверку валидности, существует небезопасная версия этой функции - from_utf8_unchecked, которая имеет такое же поведение, но пропускает проверку.
Если вам нужна String вместо &str, рассмотрите String::from_utf8.
Поскольку вы можете разместить [u8; N] в стеке и взять из него &[u8], эта функция является одним из способов получить строку, размещённую в стеке. Пример этого приведён в разделе примеров ниже.
Ошибки
Возвращает Err, если срез не является UTF-8, с описанием причины, почему предоставленный срез не является корректным UTF-8.
Примеры
Базовое использование:
#![allow(unused)] fn main() { use std::str; // несколько байтов в векторе let sparkle_heart = vec![240, 159, 146, 150]; // Мы можем использовать оператор ? (try) для проверки, являются ли байты корректными let sparkle_heart = str::from_utf8(&sparkle_heart)?; assert_eq!("💖", sparkle_heart); }
Некорректные байты:
#![allow(unused)] fn main() { use std::str; // несколько некорректных байтов в векторе let sparkle_heart = vec![0, 159, 146, 150]; assert!(str::from_utf8(&sparkle_heart).is_err()); }
Смотрите документацию Utf8Error для получения более подробной информации о типах ошибок, которые могут быть возвращены.
"Строка, размещённая в стеке":
#![allow(unused)] fn main() { use std::str; // несколько байтов в массиве, размещённом в стеке let sparkle_heart = [240, 159, 146, 150]; // Мы знаем, что эти байты корректны, поэтому просто используем `unwrap()`. let sparkle_heart: &str = str::from_utf8(&sparkle_heart).unwrap(); assert_eq!("💖", sparkle_heart); }
Некорректные байты:
#![allow(unused)] fn main() { use std::str; // несколько некорректных байтов в векторе let sparkle_heart = vec![0, 159, 146, 150]; assert!(str::from_utf8(&sparkle_heart).is_err()); }
Смотрите документацию Utf8Error для получения более подробной информации о типах ошибок, которые могут быть возвращены.
"Строка, размещённая в стеке":
#![allow(unused)] fn main() { use std::str; // несколько байтов в массиве, размещённом в стеке let sparkle_heart = [240, 159, 146, 150]; // Мы знаем, что эти байты корректны, поэтому просто используем `unwrap()`. let sparkle_heart: &str = str::from_utf8(&sparkle_heart).unwrap(); assert_eq!("💖", sparkle_heart); }