Rustでバイト列から文字列へ
自分用にメモ。
文字列からu8スライス、u8スライスから文字列への変換。
fn main() {
let test: &str = "Test";
let bytes: &[u8] = test.as_bytes();
// convert bytes => str
let res = bytes.iter().map(|&s| s as char).collect::<String>();
let converted: String = String::from_utf8(bytes.to_vec()).unwrap();
println!("{}", test);
println!("{}", converted);
}
追記
コメントにて指摘されたことを追記。
Vecに変換するとVecを生成してしまい若干非効率になる。イテレータを取得しmapすることでそれを避けられる。
ただしくはUTF-8の文字列としてバリデーションをするのと、一文字として変換するのとの差になっているそうです。
ただし、Rustでは文字はUTF-8として変換されるため、マルチバイト文字であった場合元の文字列とは異なってしまう。
String::from_utf8
はきちんとUTF-8のバイト列として解釈して変換してくれるので、マルチバイト文字でも正しく変換できる。
@blackenedgoldさんが検証して下さった結果によると、たしかに最適化無しの状態では2倍の差が出ていることが確認できる。
最適化した場合での差はそれほど大きくないのでString::from_utf8
を使う方が良さそう。