Struct Utf8Error

pub struct Utf8Error { pub(in ::str) valid_up_to: usize, pub(in ::str) error_len: Option<u8> }

Errors which can occur when attempting to interpret a sequence of u8 as a string.

As such, the from_utf8 family of functions and methods for both Strings and &strs make use of this error, for example.

Examples

This error type’s methods can be used to create functionality similar to String::from_utf8_lossy without allocating heap memory:

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
                }
            }
        }
    }
}

Fields

valid_up_to: usize
error_len: Option<u8>

Implementations

impl Utf8Error

const fn valid_up_to(&self) -> usize

Returns the index in the given string up to which valid UTF-8 was verified.

It is the maximum index such that from_utf8(&input[..index]) would return Ok(_).

Examples

Basic usage:

use std::str;

// some invalid bytes, in a vector
let sparkle_heart = vec![0, 159, 146, 150];

// std::str::from_utf8 returns a Utf8Error
let error = str::from_utf8(&sparkle_heart).unwrap_err();

// the second byte is invalid here
assert_eq!(1, error.valid_up_to());
const fn error_len(&self) -> Option<usize>

Provides more information about the failure:

  • None: the end of the input was reached unexpectedly. self.valid_up_to() is 1 to 3 bytes from the end of the input. If a byte stream (such as a file or a network socket) is being decoded incrementally, this could be a valid char whose UTF-8 byte sequence is spanning multiple chunks.

  • Some(len): an unexpected byte was encountered. The length provided is that of the invalid byte sequence that starts at the index given by valid_up_to(). Decoding should resume after that sequence (after inserting a U+FFFD REPLACEMENT CHARACTER) in case of lossy decoding.

Trait Implementations

impl Clone for Utf8Error

fn clone(&self) -> Utf8Error

impl Copy for Utf8Error

impl Debug for Utf8Error

fn fmt(&self, f: &mut Formatter<'_>) -> Result

impl Display for Utf8Error

fn fmt(&self, f: &mut Formatter<'_>) -> Result

impl Eq for Utf8Error

fn assert_fields_are_eq(&self)

impl Error for Utf8Error

impl PartialEq for Utf8Error

fn eq(&self, other: &Utf8Error) -> bool

impl StructuralPartialEq for Utf8Error

impl TrivialClone for Utf8Error

Auto Trait Implementations

impl Freeze for Utf8Error

impl RefUnwindSafe for Utf8Error

impl Send for Utf8Error

impl Sync for Utf8Error

impl Unpin for Utf8Error

impl UnsafeUnpin for Utf8Error

impl UnwindSafe for Utf8Error

Blanket Implementations

impl<T> Any for Utf8Error where T: 'static + ?Sized,

fn type_id(&self) -> TypeId

impl<T> Borrow<T> for Utf8Error where T: ?Sized,

fn borrow(&self) -> &T

impl<T> BorrowMut<T> for Utf8Error where T: ?Sized,

fn borrow_mut(&mut self) -> &mut T

impl<T> CloneToUninit for Utf8Error where T: Clone,

unsafe fn clone_to_uninit(&self, dest: *mut u8)

impl<T> From<T> for Utf8Error

fn from(t: T) -> T

Returns the argument unchanged.

impl<T> Printable for Utf8Error where T: Copy + Debug,

impl<T> SizeHint for Utf8Error where T: ?Sized,

fn lower_bound(&self) -> usize
fn upper_bound(&self) -> Option<usize>

impl<T> SizedTypeProperties for Utf8Error

impl<T, U> Into<U> for Utf8Error where U: From<T>,

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of [From]<T> for U chooses to do.

impl<T, U> TryFrom<U> for Utf8Error where U: Into<T>,

type Error = Infallible;
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

impl<T, U> TryInto<U> for Utf8Error where U: TryFrom<T>,

type Error = <U as TryFrom<T>>::Error;
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>