字符串类型间的转换

发布时间:2023-03-21 09:15
最后更新:2023-03-21 09:15
所属分类:
Rust

Rust语言在使用久了以后,就会发现程序经常需要在许多常见类型之间进行转换,这其中最有代表性的就是&strString&OsStr这一系列的字符串了。不过对于所有的强类型语言来说,都存在这种常用的类型转换。这里对一些常用的类型转换进行一下记录,方便使用时查找。

为了记录和演示方便,首先定义一些类型的变量。

1
2
3
4
5
6
7
let s: String = ...; // 包装后的字符串类型
let st: &str = ...; // 字符串字面量类型
let u: &[u8] = ...; // 不定长字节数组类型
let b: [u8; 3] = b"foo"; // 定长字节数组类型表示的字符串
let v: Vec<u8> = ...; // 不定长矢量字节数组
let os: OsString = ...; // 包装后的系统字符串类型
let ost: OsStr = ...; // 系统字符串字面量类型

字符串类型之间的转换

源类型 目标类型 转换方式 备注
&str String String::from(st)
&str OsStr OsStr::new(st)
String &str &s
String OsString OsString::from(s)
&OsStr &str ost.to_str().unwrap()
&OsStr String ost.to_os_string().into_string().unwrap() 这个转换是通过OsString来完成的。
&OsStr Cow<str> ost.to_string_lossy() 如果字符串内的字符全部有效,将自动转换为Cow<str>;否则所有无效字符将被自动填充。
&OsStr OsString ost.to_os_string()
OsString String os.into_string().unwrap()
OsString &str os.to_str().unwrap()
OsString &OsStr os.as_os_str()

字符串与字节数组类型之间的转换

源类型 目标类型 转换方式 备注
&str &[u8] st.as_bytes()
&str Vec<u8> st.as_bytes().to_owned() 通过&[u8]完成转换。
String &[u8] s.as_bytes()
String Vec<u8> s.into_bytes()
&[u8] &str str::from_utf8(u).unwrap()
&[u8] String String::from_utf8(u).unwrap()
&[u8] OsStr OsStr::from_bytes(u) 需要引用Trait std::os::unix::ffi::OsStrExt
Vec<u8> &str str::from_utf8(&v).unwrap() 通过&[u8]完成转换。
Vec<u8> String String::from_utf8(v) 需要引用Trait std::os::unix::ffi::OsStringExt
Vec<u8> OsString OsString::from_vec(v)
&OsStr &[u8] ost.as_bytes() 需要引用Trait std::os::unix::ffi::OsStrExt
OsString Vec<u8> os.into_vec() 需要引用Trait std::os::unix::ffi::OsStringExt

字节数组类型之间的转换

源类型 目标类型 转换方式 备注
&[u8] Vec<u8> u.to_owned()或者u.to_vec()
[u8; 3] &[u8] &b[..]
[u8; 3] &[u8] "foo".as_bytes() 这是直接将字符串字面量转换为字节数组的方法。
Vec<u8> &[u8] &v

索引标签
Rust
字符串
字节数组
常用类型
类型转换