2013-09-29 52 views

回答

42

的字節切片轉換爲字符串切片(假設UTF-8編碼):

use std::str; 

// 
// pub fn from_utf8(v: &[u8]) -> Result<&str, Utf8Error> 
// 
// Assuming buf: &[u8] 
// 

fn main() { 

    let buf = &[0x41u8, 0x41u8, 0x42u8]; 

    let s = match str::from_utf8(buf) { 
     Ok(v) => v, 
     Err(e) => panic!("Invalid UTF-8 sequence: {}", e), 
    }; 

    println!("result: {}", s); 
} 

的轉化是在就地,並且不需要的分配。如有必要,您可以從片中創建String

用於轉換函數庫參考:

+0

你可能想補充一點,這是可能是因爲Vec強制切片 – torkleyy

+0

,儘管示例代碼實際上並未使用Vector :-) –

26

我更喜歡String::from_utf8_lossy

fn main() { 
    let buf = &[0x41u8, 0x41u8, 0x42u8]; 
    let s = String::from_utf8_lossy(buf); 
    println!("result: {}", s); 
} 

原來無效UTF-8字節到等沒有任何錯誤處理是必須的。當你不需要時,這很好,我幾乎不需要它。你實際上從這裏得到String。它應該使打印出來的服務器更容易一些。

有時您可能需要使用into_owned()方法,因爲它在寫入時是克隆的。

+2

非常感謝'into_owned()'建議!正是我正在尋找(這使得它成爲一個正確的'字符串',你可以返回一個方法的返回值,例如)。 –

16

如果你確實有個字節(Vec<u8>)的載體,要轉換爲String,最有效的是String::from_utf8重用分配:

fn main() { 
    let bytes = vec![0x41, 0x42, 0x43]; 
    let s = String::from_utf8(bytes).expect("Found invalid UTF-8"); 
    println!("{}", s); 
} 
+1

謝謝!爲什麼其他兩個答案會忽略這個問題? – Jehan

+0

@Jehan因爲人們通常不擅長提問,特別是當他們對某種語言不熟悉時。 Rust在* array *,a * slice *和a *'Vec' *之間做了區分,但新手不知道區別。確保儘快提供所有證明有用的問題和答案。 – Shepmaster

相關問題