Структура Utf8Error
#![allow(unused)] fn main() { pub struct Utf8Error { /* приватные поля */ } }
Ошибки, которые могут возникнуть при попытке интерпретировать последовательность u8 как строку.
Таким образом, семейство функций и методов from_utf8 как для String, так и для &str используют эту ошибку.
Примеры
Методы этого типа ошибок могут быть использованы для создания функциональности, аналогичной String::from_utf8_lossy, без выделения памяти в куче:
#![allow(unused)] fn main() { fn from_utf8_lossy<F>(mut input: &[u8], mut push: F) where F: FnMut(&str) { loop { match std::str::from_utf8(input) { Ok(valid) => { push(valid); break } Err(error) => { let (valid, after_valid) = input.split_at(error.valid_up_to()); unsafe { push(std::str::from_utf8_unchecked(valid)) } push("\u{FFFD}"); if let Some(invalid_sequence_length) = error.error_len() { input = &after_valid[invalid_sequence_length..] } else { break } } } } } }
Реализации трейтов
impl Utf8Error
| Функция | Синтаксис | Пример | Назначение |
|---|---|---|---|
| valid_up_to (с версии 1.5.0, константная с 1.63.0) | pub const fn valid_up_to(&self) -> usize | let valid_len = error.valid_up_to(); | Возвращает индекс в данной строке, до которого была проверена валидность UTF-8. Это максимальный индекс такой, что from_utf8(&input[..index]) вернет Ok(_) |
| error_len (с версии 1.20.0, константная с 1.63.0) | pub const fn error_len(&self) -> Option<usize> | let error_len = error.error_len(); | Предоставляет дополнительную информацию о сбое: None - неожиданно достигнут конец входных данных. valid_up_to() находится в 1-3 байтах от конца входных данных. Если поток байтов (например, файл или сетевой сокет) декодируется по частям, это может быть валидный символ, чья UTF-8 последовательность байтов распределена по нескольким чанкам. Some(len) - встретился неожиданный байт. Предоставленная длина - это длина невалидной последовательности байтов, которая начинается с индекса, заданного valid_up_to(). Декодирование должно продолжиться после этой последовательности (после вставки U+FFFD REPLACEMENT CHARACTER) в случае потери при декодировании |
impl Clone for Utf8Error
| Функция | Синтаксис | Пример | Назначение |
|---|---|---|---|
| clone | fn clone(&self) -> Utf8Error | let cloned_error = error.clone(); | Возвращает копию значения |
| clone_from | fn clone_from(&mut self, source: &Self) | error.clone_from(&other_error); | Выполняет копирующее присваивание из source |
impl Debug for Utf8Error
| Функция | Синтаксис | Пример | Назначение |
|---|---|---|---|
| fmt | fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> | println!("{:?}", error); | Форматирует значение с помощью заданного форматтера |
impl Display for Utf8Error
| Функция | Синтаксис | Пример | Назначение |
|---|---|---|---|
| fmt | fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> | println!("{}", error); | Форматирует значение с помощью заданного форматтера |
impl Error for Utf8Error
| Функция | Синтаксис | Пример | Назначение |
|---|---|---|---|
| source (с версии 1.30.0) | fn source(&self) -> Option<&(dyn Error + 'static)> | let source = error.source(); | Возвращает исходную причину этой ошибки, если таковая имеется |
| description | fn description(&self) -> &str | let desc = error.description(); | 👎 Устарело с версии 1.42.0: используйте реализацию Display или to_string() |
| cause | fn cause(&self) -> Option<&dyn Error> | let cause = error.cause(); | 👎 Устарело с версии 1.33.0: заменено на Error::source, который поддерживает downcasting |
| provide | fn provide<'a>(&'a self, request: &mut Request<'a>) | error.provide(&mut request); | 🔬 Ночная экспериментальная функция (error_generic_member_access #99301). Предоставляет доступ на основе типов к контексту, предназначенному для отчетов об ошибках |
impl PartialEq for Utf8Error
| Функция | Синтаксис | Пример | Назначение |
|---|---|---|---|
| eq | fn eq(&self, other: &Utf8Error) -> bool | if error1 == error2 { ... } | Проверяет равенство значений self и other, используется оператором == |
| ne | fn ne(&self, other: &Rhs) -> bool | if error1 != error2 { ... } | Проверяет неравенство. Реализация по умолчанию почти всегда достаточна и не должна переопределяться без очень веской причины |
impl Copy for Utf8Error
Этот трейт не имеет методов, но позволяет типу быть скопированным путем побитового копирования
impl Eq for Utf8Error
Этот трейт не имеет методов, но указывает, что тип реализует отношение эквивалентности (рефлексивность, симметричность, транзитивность)
impl StructuralPartialEq for Utf8Error
Этот трейт не имеет методов и используется для указания структурного равенства в макросах