Rust字符串转换以及切片问题研究
from | to | 函数 |
---|---|---|
&str | String | String::from(s) 或 s.to_string() 或 s.to_owned() |
&str | &[u8] | s.as_bytes() |
&str | Vec |
s.as_bytes().to_vec() |
String | &[u8] | s.as_bytes() |
String | &str | s.as_str() 或 &s |
String | Vec |
s.into_bytes() |
&[u8] | &str | std::str::from_utf8(s).unwrap() |
&[u8] | String | String::from_utf8(s).unwrap() |
&[u8] | Vec |
s.to_vec() |
Vec |
&str | std::str::from_utf8(&s).unwrap() |
Vec |
String | String::from_utf8(s).unwrap() |
Vec |
&[u8] | &s 或 s.as_slice() |
注:变量 s 为 from 类型
示例:
String 和 &str 之间的转换:
// String 转 &str
let s = String::from("hello");
let s_slice: &str = &s;
// &str 转 String
let s = "hello";
let s_string: String = s.to_string();
Vec
// Vec<u8> 转 &[u8]
let v: Vec<u8> = vec![72, 101, 108, 108, 111]; // "Hello"
let v_slice: &[u8] = &v;
// &[u8] 转 Vec<u8>
let v_slice: &[u8] = &[72, 101, 108, 108, 111]; // "Hello"
let v_vec: Vec<u8> = v_slice.to_vec();
String 和 Vec
// String 转 Vec<u8>
let s = String::from("hello");
let v: Vec<u8> = s.into_bytes();
// Vec<u8> 转 String
let v: Vec<u8> = vec![104, 101, 108, 108, 111]; // "hello"
let s: String = String::from_utf8_lossy(&v).to_string();
&str 和 &[u8] 之间的转换:
// &str 转 &[u8]
let s: &str = "hello";
let s_bytes: &[u8] = s.as_bytes();
// &[u8] 转 &str
let s_bytes: &[u8] = &[104, 101, 108, 108, 111]; // "hello"
let s_str: &str = std::str::from_utf8(s_bytes).unwrap();
注意:在这些转换中,可能会出现编码问题。
特别是,在将字节序列转换为字符串时,必须考虑编码方式(例如UTF-8),否则会导致错误。
在某些情况下,使用特定的编码方式(例如ISO 8859-1)可能更合适。
删除String字符串首末位字符的几个方法:
方法一:
fn main() {
let mut s = "Hello World".to_string();
s.pop(); // remove last
s.remove(0); // remove first
}
方法二:
使用.char()迭代器并忽略第一个和最后一个元素:
fn rem_first_and_last(value: &str) -> &str {
let mut chars = value.chars();
chars.next(); //推进迭代器并返回下一个值
chars.next_back(); //从迭代器的末尾删除并返回一个元素
chars.as_str()
}
能够正确处理多字节 unicode 字符串,但可能会产生额外的开销。
方法三:
使用 split_at() 对字符串进行分割,它的返回值是 (&str, &str) 形式:
fn main() {
let msg = "Hello, world!";
let msg = msg.split_at(msg.len() - 1);
let msg = msg.0.split_at(1);
println!("{}", msg.1);
}
方法四:
fn main() {
let string: &str = "Hello World";
let first_last_off: &str = &string[1..string.len() - 1];
println!("{}", first_last_off);
}