34
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rustでバイト列から文字列へ

Last updated at Posted at 2017-10-23

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を使う方が良さそう。

34
23
9

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?