Struct widestring::ucstring::U16CString

source ·
pub struct U16CString { /* private fields */ }
Expand description

An owned, mutable C-style 16-bit wide string for FFI that is nul-aware and nul-terminated.

The string slice of a U16CString is U16CStr.

U16CString strings do not have a defined encoding. While it is sometimes assumed that they contain possibly invalid or ill-formed UTF-16 data, they may be used for any wide encoded string.

§Nul termination

U16CString is aware of nul (0) values. Unless unchecked conversions are used, all U16CString strings end with a nul-terminator in the underlying buffer and contain no internal nul values. These strings are intended to be used with FFI functions that require nul-terminated strings.

Because of the nul termination requirement, multiple classes methods for provided for construction a U16CString under various scenarios. By default, methods such as from_ptr and from_vec return an error if it contains any interior nul values before the terminator. For these methods, the input does not need to contain the terminating nul; it is added if it is does not exist.

_truncate methods on the other hand, such as from_ptr_truncate and from_vec_truncate, construct a string that terminates with the first nul value encountered in the string, and do not return an error. They automatically ensure the string is terminated in a nul value even if it was not originally.

Finally, unsafe _unchecked variants of these methods, such as from_ptr_unchecked and from_vec_unchecked allow bypassing any checks for nul values, when the input has already been ensured to no interior nul values. Again, any missing nul terminator is automatically added if necessary.

§Examples

The easiest way to use U16CString outside of FFI is with the u16cstr! macro to convert string literals into nul-terminated UTF-16 strings at compile time:

use widestring::{u16cstr, U16CString};
let hello = U16CString::from(u16cstr!("Hello, world!"));

You can also convert any u16 slice or vector directly:

use widestring::{u16cstr, U16CString};

let sparkle_heart = vec![0xd83d, 0xdc96];
let sparkle_heart = U16CString::from_vec(sparkle_heart).unwrap();
// The string will add the missing nul terminator

assert_eq!(u16cstr!("💖"), sparkle_heart);

// This unpaired UTf-16 surrogate is invalid UTF-16, but is perfectly valid in U16CString
let malformed_utf16 = vec![0xd83d, 0x0];
let s = U16CString::from_vec(malformed_utf16).unwrap();

assert_eq!(s.len(), 1); // Note the terminating nul is not counted in the length

When working with a FFI, it is useful to create a U16CString from a pointer:

use widestring::{u16cstr, U16CString};

let sparkle_heart = [0xd83d, 0xdc96, 0x0];
let s = unsafe {
    // Note the string and pointer length does not include the nul terminator
    U16CString::from_ptr(sparkle_heart.as_ptr(), sparkle_heart.len() - 1).unwrap()
};
assert_eq!(u16cstr!("💖"), s);

// Alternatively, if the length of the pointer is unknown but definitely terminates in nul,
// a C-style string version can be used
let s = unsafe { U16CString::from_ptr_str(sparkle_heart.as_ptr()) };

assert_eq!(u16cstr!("💖"), s);

Implementations§

source§

impl U16CString

source

pub const NUL_TERMINATOR: u16 = 0u16

The nul terminator character value.

source

pub fn new() -> Self

Constructs a new empty wide C string.

source

pub fn from_vec(v: impl Into<Vec<u16>>) -> Result<Self, ContainsNul<u16>>

Constructs a wide C string from a container of wide character data.

This method will consume the provided data and use the underlying elements to construct a new string. The data will be scanned for invalid interior nul values.

§Errors

This function will return an error if the data contains a nul value that is not the terminating nul. The returned error will contain the original Vec as well as the position of the nul value.

§Examples
use widestring::U16CString;
let v = vec![84u16, 104u16, 101u16]; // 'T' 'h' 'e'
// Create a wide string from the vector
let wcstr = U16CString::from_vec(v).unwrap();

Empty vectors are valid and will return an empty string with a nul terminator:

use widestring::U16CString;
let wcstr = U16CString::from_vec(vec![]).unwrap();
assert_eq!(wcstr, U16CString::default());

The following example demonstrates errors from nul values in a vector.

use widestring::U16CString;
let v = vec![84u16, 0u16, 104u16, 101u16]; // 'T' NUL 'h' 'e'
// Create a wide string from the vector
let res = U16CString::from_vec(v);
assert!(res.is_err());
assert_eq!(res.err().unwrap().nul_position(), 1);
source

pub fn from_vec_truncate(v: impl Into<Vec<u16>>) -> Self

Constructs a wide C string from a container of wide character data, truncating at the first nul terminator.

The string will be truncated at the first nul value in the data.

§Examples
use widestring::U16CString;
let v = vec![84u16, 104u16, 101u16, 0u16]; // 'T' 'h' 'e' NUL
// Create a wide string from the vector
let wcstr = U16CString::from_vec_truncate(v);
source

pub unsafe fn from_vec_unchecked(v: impl Into<Vec<u16>>) -> Self

Constructs a wide C string from a vector without checking for interior nul values.

A terminating nul value will be appended if the vector does not already have a terminating nul.

§Safety

This method is equivalent to from_vec except that no runtime assertion is made that v contains no interior nul values. Providing a vector with any nul values that are not the last value in the vector will result in an invalid C string.

source

pub fn from_ustr(s: impl AsRef<U16Str>) -> Result<Self, ContainsNul<u16>>

Constructs a wide C string from anything that can be converted to a wide string slice.

The string will be scanned for invalid interior nul values.

§Errors

This function will return an error if the data contains a nul value that is not the terminating nul. The returned error will contain a Vec as well as the position of the nul value.

source

pub fn from_ustr_truncate(s: impl AsRef<U16Str>) -> Self

Constructs a wide C string from anything that can be converted to a wide string slice, truncating at the first nul terminator.

The string will be truncated at the first nul value in the string.

source

pub unsafe fn from_ustr_unchecked(s: impl AsRef<U16Str>) -> Self

Constructs a wide C string from anything that can be converted to a wide string slice, without scanning for invalid nul values.

§Safety

This method is equivalent to from_ustr except that no runtime assertion is made that v contains no interior nul values. Providing a string with any nul values that are not the last value in the vector will result in an invalid C string.

source

pub unsafe fn from_ptr_str(p: *const u16) -> Self

Constructs a new wide C string copied from a nul-terminated string pointer.

This will scan for nul values beginning with p. The first nul value will be used as the nul terminator for the string, similar to how libc string functions such as strlen work.

If you wish to avoid copying the string pointer, use U16CStr::from_ptr_str or U32CStr::from_ptr_str instead.

§Safety

This function is unsafe as there is no guarantee that the given pointer is valid or has a nul terminator, and the function could scan past the underlying buffer.

In addition, the data must meet the safety conditions of std::slice::from_raw_parts.

§Panics

This function panics if p is null.

§Caveat

The lifetime for the returned string is inferred from its usage. To prevent accidental misuse, it’s suggested to tie the lifetime to whichever source lifetime is safe in the context, such as by providing a helper function taking the lifetime of a host value for the string, or by explicit annotation.

source

pub unsafe fn from_ptr( p: *const u16, len: usize, ) -> Result<Self, ContainsNul<u16>>

Constructs a wide C string copied from a pointer and a length, checking for invalid interior nul values.

The len argument is the number of elements, not the number of bytes, and does not include the nul terminator of the string. If len is 0, p is allowed to be a null pointer.

The resulting string will always be nul-terminated even if the pointer data is not.

§Errors

This will scan the pointer string for an interior nul value and error if one is found. To avoid scanning for interior nuls, from_ptr_unchecked may be used instead. The returned error will contain a Vec as well as the position of the nul value.

§Safety

This function is unsafe as there is no guarantee that the given pointer is valid for len elements.

In addition, the data must meet the safety conditions of std::slice::from_raw_parts.

§Panics

Panics if len is greater than 0 but p is a null pointer.

source

pub unsafe fn from_ptr_truncate(p: *const u16, len: usize) -> Self

Constructs a wide C string copied from a pointer and a length, truncating at the first nul terminator.

The len argument is the number of elements, not the number of bytes. This will scan for nul values beginning with p until offset len. The first nul value will be used as the nul terminator for the string, ignoring any remaining values left before len. If no nul value is found, the whole string of length len is used, and a new nul-terminator will be added to the resulting string. If len is 0, p is allowed to be a null pointer.

§Safety

This function is unsafe as there is no guarantee that the given pointer is valid for len elements.

In addition, the data must meet the safety conditions of std::slice::from_raw_parts.

§Panics

Panics if len is greater than 0 but p is a null pointer.

source

pub unsafe fn from_ptr_unchecked(p: *const u16, len: usize) -> Self

Constructs a wide C string copied from a pointer and a length without checking for any nul values.

The len argument is the number of elements, not the number of bytes, and does not include the nul terminator of the string. If len is 0, p is allowed to be a null pointer.

The resulting string will always be nul-terminated even if the pointer data is not.

§Safety

This function is unsafe as there is no guarantee that the given pointer is valid for len elements.

In addition, the data must meet the safety conditions of std::slice::from_raw_parts.

The interior values of the pointer are not scanned for nul. Any interior nul values or will result in an invalid C string.

§Panics

Panics if len is greater than 0 but p is a null pointer.

source

pub fn as_ucstr(&self) -> &U16CStr

Converts to a wide C string slice.

source

pub fn as_mut_ucstr(&mut self) -> &mut U16CStr

Converts to a mutable wide C string slice.

source

pub fn into_ustring(self) -> U16String

Converts this string into a wide string without a nul terminator.

The resulting string will not contain a nul-terminator, and will contain no other nul values.

source

pub fn into_ustring_with_nul(self) -> U16String

Converts this string into a wide string with a nul terminator.

The resulting vector will contain a nul-terminator and no interior nul values.

source

pub fn into_vec(self) -> Vec<u16>

Converts the string into a Vec without a nul terminator, consuming the string in the process.

The resulting vector will not contain a nul-terminator, and will contain no other nul values.

source

pub fn into_vec_with_nul(self) -> Vec<u16>

Converts the string into a Vec, consuming the string in the process.

The resulting vector will contain a nul-terminator and no interior nul values.

source

pub fn into_raw(self) -> *mut u16

Transfers ownership of the string to a C caller.

§Safety

The pointer must be returned to Rust and reconstituted using from_raw to be properly deallocated. Specifically, one should not use the standard C free function to deallocate this string. Failure to call from_raw will lead to a memory leak.

source

pub unsafe fn from_raw(p: *mut u16) -> Self

Retakes ownership of a wide C string that was transferred to C.

This should only be used in combination with into_raw. To construct a new wide C string from a pointer, use from_ptr_str.

§Safety

This should only ever be called with a pointer that was earlier obtained by calling into_raw. Additionally, the length of the string will be recalculated from the pointer by scanning for the nul-terminator.

§Panics

Panics if p is a null pointer.

source

pub fn into_boxed_ucstr(self) -> Box<U16CStr>

Converts this wide C string into a boxed wide C string slice.

§Examples
use widestring::{U16CString, U16CStr};

let mut v = vec![102u16, 111u16, 111u16]; // "foo"
let c_string = U16CString::from_vec(v.clone()).unwrap();
let boxed = c_string.into_boxed_ucstr();
v.push(0);
assert_eq!(&*boxed, U16CStr::from_slice(&v).unwrap());
source§

impl U16CString

source

pub fn from_str(s: impl AsRef<str>) -> Result<Self, ContainsNul<u16>>

Constructs a U16CString copy from a str, encoding it as UTF-16.

This makes a string copy of the str. Since str will always be valid UTF-8, the resulting U16CString will also be valid UTF-16.

The string will be scanned for nul values, which are invalid anywhere except the final character.

The resulting string will always be nul-terminated even if the original string is not.

§Errors

This function will return an error if the data contains a nul value anywhere except the final position. The returned error will contain a Vec<u16> as well as the position of the nul value.

§Examples
use widestring::U16CString;
let s = "MyString";
// Create a wide string from the string
let wcstr = U16CString::from_str(s).unwrap();

The following example demonstrates errors from nul values in a string.

use widestring::U16CString;
let s = "My\u{0}String";
// Create a wide string from the string
let res = U16CString::from_str(s);
assert!(res.is_err());
assert_eq!(res.err().unwrap().nul_position(), 2);
source

pub unsafe fn from_str_unchecked(s: impl AsRef<str>) -> Self

Constructs a U16CString copy from a str, encoding it as UTF-16, without checking for interior nul values.

This makes a string copy of the str. Since str will always be valid UTF-8, the resulting U16CString will also be valid UTF-16.

The resulting string will always be nul-terminated even if the original string is not.

§Safety

This method is equivalent to from_str except that no runtime assertion is made that s contains no interior nul values. Providing a string with nul values that are not the last character will result in an invalid U16CString.

§Examples
use widestring::U16CString;
let s = "MyString";
// Create a wide string from the string
let wcstr = unsafe { U16CString::from_str_unchecked(s) };
source

pub fn from_str_truncate(s: impl AsRef<str>) -> Self

Constructs a U16CString copy from a str, encoding it as UTF-16, truncating at the first nul terminator.

This makes a string copy of the str. Since str will always be valid UTF-8, the resulting U16CString will also be valid UTF-16.

The string will be truncated at the first nul value in the string. The resulting string will always be nul-terminated even if the original string is not.

§Examples
use widestring::U16CString;
let s = "My\u{0}String";
// Create a wide string from the string
let wcstr = U16CString::from_str_truncate(s);
assert_eq!(wcstr.to_string_lossy(), "My");
source

pub fn from_os_str(s: impl AsRef<OsStr>) -> Result<Self, ContainsNul<u16>>

Constructs a U16CString copy from an OsStr.

This makes a string copy of the OsStr. Since OsStr makes no guarantees that it is valid data, there is no guarantee that the resulting U16CString will be valid UTF-16.

The string will be scanned for nul values, which are invalid anywhere except the final character. The resulting string will always be nul-terminated even if the original string is not.

Note that the encoding of OsStr is platform-dependent, so on some platforms this may make an encoding conversions, while on other platforms (such as windows) no changes to the string will be made.

§Errors

This function will return an error if the data contains a nul value anywhere except the last character. The returned error will contain a Vec<u16> as well as the position of the nul value.

§Examples
use widestring::U16CString;
let s = "MyString";
// Create a wide string from the string
let wcstr = U16CString::from_os_str(s).unwrap();

The following example demonstrates errors from nul values in the string.

use widestring::U16CString;
let s = "My\u{0}String";
// Create a wide string from the string
let res = U16CString::from_os_str(s);
assert!(res.is_err());
assert_eq!(res.err().unwrap().nul_position(), 2);
source

pub unsafe fn from_os_str_unchecked(s: impl AsRef<OsStr>) -> Self

Constructs a U16CString copy from an OsStr, without checking for nul values.

This makes a string copy of the OsStr. Since OsStr makes no guarantees that it is valid data, there is no guarantee that the resulting U16CString will be valid UTF-16.

The resulting string will always be nul-terminated even if the original string is not.

Note that the encoding of OsStr is platform-dependent, so on some platforms this may make an encoding conversions, while on other platforms (such as windows) no changes to the string will be made.

§Safety

This method is equivalent to from_os_str except that no runtime assertion is made that s contains no interior nul values. Providing a string with nul values anywhere but the last character will result in an invalid U16CString.

§Examples
use widestring::U16CString;
let s = "MyString";
// Create a wide string from the string
let wcstr = unsafe { U16CString::from_os_str_unchecked(s) };
source

pub fn from_os_str_truncate(s: impl AsRef<OsStr>) -> Self

Constructs a U16CString copy from an OsStr, truncating at the first nul terminator.

This makes a string copy of the OsStr. Since OsStr makes no guarantees that it is valid data, there is no guarantee that the resulting U16CString will be valid UTF-16.

The string will be truncated at the first nul value in the string. The resulting string will always be nul-terminated even if the original string is not.

Note that the encoding of OsStr is platform-dependent, so on some platforms this may make an encoding conversions, while on other platforms (such as windows) no changes to the string will be made.

§Examples
use widestring::U16CString;
let s = "My\u{0}String";
// Create a wide string from the string
let wcstr = U16CString::from_os_str_truncate(s);
assert_eq!(wcstr.to_string_lossy(), "My");

Methods from Deref<Target = U16CStr>§

source

pub const NUL_TERMINATOR: u16 = 0u16

source

pub fn to_ucstring(&self) -> U16CString

Copies the string reference to a new owned wide C string.

source

pub fn to_ustring(&self) -> U16String

Copies the string reference to a new owned wide string.

The resulting wide string will not have a nul terminator.

§Examples
use widestring::U16CString;
let wcstr = U16CString::from_str("MyString").unwrap();
// Convert U16CString to a U16String
let wstr = wcstr.to_ustring();

// U16CString will have a terminating nul
let wcvec = wcstr.into_vec_with_nul();
assert_eq!(wcvec[wcvec.len()-1], 0);
// The resulting U16String will not have the terminating nul
let wvec = wstr.into_vec();
assert_ne!(wvec[wvec.len()-1], 0);
source

pub fn as_slice(&self) -> &[u16]

Converts to a slice of the underlying elements.

The slice will not include the nul terminator.

source

pub unsafe fn as_mut_slice(&mut self) -> &mut [u16]

Converts to a mutable slice of the underlying elements.

The slice will not include the nul terminator.

§Safety

This method is unsafe because you can violate the invariants of this type when mutating the slice (i.e. by adding interior nul values).

source

pub fn as_slice_with_nul(&self) -> &[u16]

Converts to a slice of the underlying elements, including the nul terminator.

source

pub fn as_ptr(&self) -> *const u16

Returns a raw pointer to the string.

The caller must ensure that the string outlives the pointer this function returns, or else it will end up pointing to garbage.

The caller must also ensure that the memory the pointer (non-transitively) points to is never written to (except inside an UnsafeCell) using this pointer or any pointer derived from it. If you need to mutate the contents of the string, use as_mut_ptr.

Modifying the container referenced by this string may cause its buffer to be reallocated, which would also make any pointers to it invalid.

source

pub fn as_mut_ptr(&mut self) -> *mut u16

Returns a mutable raw pointer to the string.

The caller must ensure that the string outlives the pointer this function returns, or else it will end up pointing to garbage.

Modifying the container referenced by this string may cause its buffer to be reallocated, which would also make any pointers to it invalid.

source

pub fn as_ptr_range(&self) -> Range<*const u16>

Returns the two raw pointers spanning the string slice.

The returned range is half-open, which means that the end pointer points one past the last element of the slice. This way, an empty slice is represented by two equal pointers, and the difference between the two pointers represents the size of the slice.

See as_ptr for warnings on using these pointers. The end pointer requires extra caution, as it does not point to a valid element in the slice.

This function is useful for interacting with foreign interfaces which use two pointers to refer to a range of elements in memory, as is common in C++.

source

pub fn as_mut_ptr_range(&mut self) -> Range<*mut u16>

Returns the two unsafe mutable pointers spanning the string slice.

The returned range is half-open, which means that the end pointer points one past the last element of the slice. This way, an empty slice is represented by two equal pointers, and the difference between the two pointers represents the size of the slice.

See as_mut_ptr for warnings on using these pointers. The end pointer requires extra caution, as it does not point to a valid element in the slice.

This function is useful for interacting with foreign interfaces which use two pointers to refer to a range of elements in memory, as is common in C++.

source

pub fn len(&self) -> usize

Returns the length of the string as number of elements (not number of bytes) not including nul terminator.

source

pub fn is_empty(&self) -> bool

Returns whether this string contains no data (i.e. is only the nul terminator).

source

pub fn as_ustr(&self) -> &U16Str

Returns a wide string slice to this wide C string slice.

The wide string slice will not include the nul-terminator.

source

pub fn as_ustr_with_nul(&self) -> &U16Str

Returns a wide string slice to this wide C string slice.

The wide string slice will include the nul-terminator.

source

pub unsafe fn as_mut_ustr(&mut self) -> &mut U16Str

Returns a mutable wide string slice to this wide C string slice.

The wide string slice will not include the nul-terminator.

§Safety

This method is unsafe because you can violate the invariants of this type when mutating the string (i.e. by adding interior nul values).

source

pub fn display(&self) -> Display<'_, U16CStr>

Returns an object that implements Display for printing strings that may contain non-Unicode data.

A wide C string might data of any encoding. This function assumes the string is encoded in UTF-16, and returns a struct implements the Display trait in a way that decoding the string is lossy but no heap allocations are performed, such as by to_string_lossy.

By default, invalid Unicode data is replaced with U+FFFD REPLACEMENT CHARACTER (�). If you wish to simply skip any invalid Uncode data and forego the replacement, you may use the alternate formatting with {:#}.

§Examples

Basic usage:

use widestring::U16CStr;

// 𝄞mus<invalid>ic<invalid>
let s = U16CStr::from_slice(&[
    0xD834, 0xDD1E, 0x006d, 0x0075, 0x0073, 0xDD1E, 0x0069, 0x0063, 0xD834, 0x0000,
]).unwrap();

assert_eq!(format!("{}", s.display()),
"𝄞mus�ic�"
);

Using alternate formatting style to skip invalid values entirely:

use widestring::U16CStr;

// 𝄞mus<invalid>ic<invalid>
let s = U16CStr::from_slice(&[
    0xD834, 0xDD1E, 0x006d, 0x0075, 0x0073, 0xDD1E, 0x0069, 0x0063, 0xD834, 0x0000,
]).unwrap();

assert_eq!(format!("{:#}", s.display()),
"𝄞music"
);
source

pub fn get<I>(&self, i: I) -> Option<&U16Str>
where I: SliceIndex<[u16], Output = [u16]>,

Returns a subslice of the string.

This is the non-panicking alternative to indexing the string. Returns None whenever equivalent indexing operation would panic.

source

pub unsafe fn get_mut<I>(&mut self, i: I) -> Option<&mut U16Str>
where I: SliceIndex<[u16], Output = [u16]>,

Returns a mutable subslice of the string.

This is the non-panicking alternative to indexing the string. Returns None whenever equivalent indexing operation would panic.

§Safety

This method is unsafe because you can violate the invariants of this type when mutating the memory the pointer points to (i.e. by adding interior nul values).

source

pub unsafe fn get_unchecked<I>(&self, i: I) -> &U16Str
where I: SliceIndex<[u16], Output = [u16]>,

Returns an unchecked subslice of the string.

This is the unchecked alternative to indexing the string.

§Safety

Callers of this function are responsible that these preconditions are satisfied:

  • The starting index must not exceed the ending index;
  • Indexes must be within bounds of the original slice.

Failing that, the returned string slice may reference invalid memory.

source

pub unsafe fn get_unchecked_mut<I>(&mut self, i: I) -> &mut U16Str
where I: SliceIndex<[u16], Output = [u16]>,

Returns aa mutable, unchecked subslice of the string.

This is the unchecked alternative to indexing the string.

§Safety

Callers of this function are responsible that these preconditions are satisfied:

  • The starting index must not exceed the ending index;
  • Indexes must be within bounds of the original slice.

Failing that, the returned string slice may reference invalid memory.

This method is unsafe because you can violate the invariants of this type when mutating the memory the pointer points to (i.e. by adding interior nul values).

source

pub fn split_at(&self, mid: usize) -> (&U16Str, &U16Str)

Divide one string slice into two at an index.

The argument, mid, should be an offset from the start of the string.

The two slices returned go from the start of the string slice to mid, and from mid to the end of the string slice.

To get mutable string slices instead, see the split_at_mut method.

source

pub unsafe fn split_at_mut(&mut self, mid: usize) -> (&mut U16Str, &mut U16Str)

Divide one mutable string slice into two at an index.

The argument, mid, should be an offset from the start of the string.

The two slices returned go from the start of the string slice to mid, and from mid to the end of the string slice.

To get immutable string slices instead, see the split_at method.

§Safety

This method is unsafe because you can violate the invariants of this type when mutating the memory the pointer points to (i.e. by adding interior nul values).

source

pub fn repeat(&self, n: usize) -> U16CString

Creates a new owned string by repeating this string n times.

§Panics

This function will panic if the capacity would overflow.

source

pub fn to_os_string(&self) -> OsString

Copys a string to an owned OsString.

This makes a string copy of the U16CStr. Since U16CStr makes no guarantees that it is valid UTF-16, there is no guarantee that the resulting OsString will be valid data. The OsString will not have a nul terminator.

Note that the encoding of OsString is platform-dependent, so on some platforms this may make an encoding conversions, while on other platforms (such as windows) no changes to the string will be made.

§Examples
use widestring::U16CString;
use std::ffi::OsString;
let s = "MyString";
// Create a wide string from the string
let wstr = U16CString::from_str(s).unwrap();
// Create an OsString from the wide string
let osstr = wstr.to_os_string();

assert_eq!(osstr, OsString::from(s));
source

pub fn to_string(&self) -> Result<String, Utf16Error>

Copies the string to a String if it contains valid UTF-16 data.

This method assumes this string is encoded as UTF-16 and attempts to decode it as such. It will *not have a nul terminator.

§Errors

Returns an error if the string contains any invalid UTF-16 data.

§Examples
use widestring::U16CString;
let s = "MyString";
// Create a wide string from the string
let wstr = U16CString::from_str(s).unwrap();
// Create a regular string from the wide string
let s2 = wstr.to_string().unwrap();

assert_eq!(s2, s);
source

pub fn to_string_lossy(&self) -> String

Decodes the string reference to a String even if it is invalid UTF-16 data.

This method assumes this string is encoded as UTF-16 and attempts to decode it as such. Any invalid sequences are replaced with U+FFFD REPLACEMENT CHARACTER, which looks like this: �. It will *not have a nul terminator.

§Examples
use widestring::U16CString;
let s = "MyString";
// Create a wide string from the string
let wstr = U16CString::from_str(s).unwrap();
// Create a regular string from the wide string
let s2 = wstr.to_string_lossy();

assert_eq!(s2, s);
source

pub fn chars(&self) -> CharsUtf16<'_>

Returns an iterator over the chars of a string slice.

As this string has no defined encoding, this method assumes the string is UTF-16. Since it may consist of invalid UTF-16, the iterator returned by this method is an iterator over Result<char, DecodeUtf16Error> instead of chars directly. If you would like a lossy iterator over charss directly, instead use chars_lossy.

It’s important to remember that char represents a Unicode Scalar Value, and may not match your idea of what a ‘character’ is. Iteration over grapheme clusters may be what you actually want. That functionality is not provided by by this crate.

source

pub fn chars_lossy(&self) -> CharsLossyUtf16<'_>

Returns a lossy iterator over the chars of a string slice.

As this string has no defined encoding, this method assumes the string is UTF-16. Since it may consist of invalid UTF-16, the iterator returned by this method will replace unpaired surrogates with U+FFFD REPLACEMENT CHARACTER (�). This is a lossy version of chars.

It’s important to remember that char represents a Unicode Scalar Value, and may not match your idea of what a ‘character’ is. Iteration over grapheme clusters may be what you actually want. That functionality is not provided by by this crate.

source

pub fn char_indices(&self) -> CharIndicesUtf16<'_>

Returns an iterator over the chars of a string slice, and their positions.

As this string has no defined encoding, this method assumes the string is UTF-16. Since it may consist of invalid UTF-16, the iterator returned by this method is an iterator over is an iterator over Result<char, DecodeUtf16Error> as well as their positions, instead of chars directly. If you would like a lossy indices iterator over charss directly, instead use char_indices_lossy.

The iterator yields tuples. The position is first, the char is second.

source

pub fn char_indices_lossy(&self) -> CharIndicesLossyUtf16<'_>

Returns a lossy iterator over the chars of a string slice, and their positions.

As this string slice may consist of invalid UTF-16, the iterator returned by this method will replace unpaired surrogates with U+FFFD REPLACEMENT CHARACTER (�), as well as the positions of all characters. This is a lossy version of char_indices.

The iterator yields tuples. The position is first, the char is second.

Trait Implementations§

source§

impl AsMut<U16CStr> for U16CString

source§

fn as_mut(&mut self) -> &mut U16CStr

Converts this type into a mutable reference of the (usually inferred) input type.
source§

impl AsRef<[u16]> for U16CString

source§

fn as_ref(&self) -> &[u16]

Converts this type into a shared reference of the (usually inferred) input type.
source§

impl AsRef<U16CStr> for U16CString

source§

fn as_ref(&self) -> &U16CStr

Converts this type into a shared reference of the (usually inferred) input type.
source§

impl AsRef<U16Str> for U16CString

source§

fn as_ref(&self) -> &U16Str

Converts this type into a shared reference of the (usually inferred) input type.
source§

impl Borrow<U16CStr> for U16CString

source§

fn borrow(&self) -> &U16CStr

Immutably borrows from an owned value. Read more
source§

impl BorrowMut<U16CStr> for U16CString

source§

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

Mutably borrows from an owned value. Read more
source§

impl Clone for U16CString

source§

fn clone(&self) -> U16CString

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for U16CString

source§

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

Formats the value using the given formatter. Read more
source§

impl Default for U16CString

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl Deref for U16CString

§

type Target = U16CStr

The resulting type after dereferencing.
source§

fn deref(&self) -> &U16CStr

Dereferences the value.
source§

impl DerefMut for U16CString

source§

fn deref_mut(&mut self) -> &mut Self::Target

Mutably dereferences the value.
source§

impl Drop for U16CString

source§

fn drop(&mut self)

Executes the destructor for this type. Read more
source§

impl Extend<U16CString> for U16String

source§

fn extend<T: IntoIterator<Item = U16CString>>(&mut self, iter: T)

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, item: A)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
source§

impl<'a, T: ?Sized + AsRef<U16CStr>> From<&'a T> for U16CString

source§

fn from(s: &'a T) -> Self

Converts to this type from the input type.
source§

impl From<Box<U16CStr>> for U16CString

source§

fn from(s: Box<U16CStr>) -> Self

Converts to this type from the input type.
source§

impl From<U16CString> for Box<U16CStr>

source§

fn from(s: U16CString) -> Box<U16CStr>

Converts to this type from the input type.
source§

impl<'a> From<U16CString> for Cow<'a, U16CStr>

source§

fn from(s: U16CString) -> Cow<'a, U16CStr>

Converts to this type from the input type.
source§

impl From<U16CString> for OsString

source§

fn from(s: U16CString) -> OsString

Converts to this type from the input type.
source§

impl From<U16CString> for U16String

source§

fn from(s: U16CString) -> Self

Converts to this type from the input type.
source§

impl From<U16CString> for Vec<u16>

source§

fn from(value: U16CString) -> Self

Converts to this type from the input type.
source§

impl FromIterator<U16CString> for U16String

source§

fn from_iter<T: IntoIterator<Item = U16CString>>(iter: T) -> Self

Creates a value from an iterator. Read more
source§

impl Hash for U16CString

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl<I> Index<I> for U16CString
where I: SliceIndex<[u16], Output = [u16]>,

§

type Output = U16Str

The returned type after indexing.
source§

fn index(&self, index: I) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
source§

impl Ord for U16CString

source§

fn cmp(&self, other: &U16CString) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
source§

impl<'a> PartialEq<&'a U16CStr> for U16CString

source§

fn eq(&self, other: &&'a U16CStr) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<&'a U16Str> for U16CString

source§

fn eq(&self, other: &&'a U16Str) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<Cow<'a, U16CStr>> for U16CString

source§

fn eq(&self, other: &Cow<'a, U16CStr>) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialEq<Cow<'a, U16Str>> for U16CString

source§

fn eq(&self, other: &Cow<'a, U16Str>) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<U16CStr> for U16CString

source§

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

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<U16CString> for &U16CStr

source§

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

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<U16CString> for &U16Str

source§

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

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<U16CString> for U16CStr

source§

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

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<U16CString> for U16Str

source§

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

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<U16CString> for U16String

source§

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

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<U16CString> for Utf16Str

source§

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

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<U16CString> for Utf16String

source§

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

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<U16Str> for U16CString

source§

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

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<U16String> for U16CString

source§

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

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<Utf16Str> for U16CString

source§

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

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl PartialEq<Utf16String> for U16CString

source§

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

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl PartialEq for U16CString

source§

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

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<'a> PartialOrd<&'a U16CStr> for U16CString

source§

fn partial_cmp(&self, other: &&'a U16CStr) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more
source§

impl<'a> PartialOrd<&'a U16Str> for U16CString

source§

fn partial_cmp(&self, other: &&'a U16Str) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more
source§

impl<'a> PartialOrd<Cow<'a, U16CStr>> for U16CString

source§

fn partial_cmp(&self, other: &Cow<'a, U16CStr>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more
source§

impl<'a> PartialOrd<Cow<'a, U16Str>> for U16CString

source§

fn partial_cmp(&self, other: &Cow<'a, U16Str>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more
source§

impl PartialOrd<U16CStr> for U16CString

source§

fn partial_cmp(&self, other: &U16CStr) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more
source§

impl PartialOrd<U16CString> for U16String

source§

fn partial_cmp(&self, other: &U16CString) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more
source§

impl PartialOrd<U16Str> for U16CString

source§

fn partial_cmp(&self, other: &U16Str) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more
source§

impl PartialOrd<U16String> for U16CString

source§

fn partial_cmp(&self, other: &U16String) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more
source§

impl PartialOrd for U16CString

source§

fn partial_cmp(&self, other: &U16CString) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more
source§

impl TryFrom<U16CString> for Utf16String

§

type Error = Utf16Error

The type returned in the event of a conversion error.
source§

fn try_from(value: U16CString) -> Result<Self, Self::Error>

Performs the conversion.
source§

impl Eq for U16CString

source§

impl StructuralPartialEq for U16CString

Auto Trait Implementations§

Blanket Implementations§

source§

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

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

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

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

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

source§

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

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

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

source§

fn into(self) -> U

Calls U::from(self).

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

source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

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

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

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

Performs the conversion.
source§

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

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

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

Performs the conversion.