2013-09-29 10 views

Odpowiedz

42

celu przekształcenia kawałek bajtów segmentu łańcucha (zakładając kodowania 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); 
} 

Konwersja jest na miejscu, a nie wymaga przyporządkowania. W razie potrzeby możesz utworzyć String z plasterka.

Odniesienie Biblioteka dla funkcji konwersji:

+0

Można dodać, że jest to możliwe, ponieważ Vec wymusza na plasterki – torkleyy

+0

, chociaż przykładowy kod nie używa w rzeczywistości wektora :-) –

26

wolę String::from_utf8_lossy:

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

Okazuje nieprawidłowe UTF-8 bajtów do i tak nie ma obsługi błędów jest wymagane. Jest to dobre, gdy tego nie potrzebujesz i prawie nie potrzebuję. Otrzymujesz od tego String. Powinno to nieco ułatwić drukowanie tego, co dostajesz z serwera.

Czasami może zajść potrzeba użycia metody into_owned(), ponieważ jest to klon podczas pisania.

+2

Wielkie dzięki za sugestię 'do_owned()'! Było dokładnie to, czego szukałem (dzięki temu staje się właściwym 'Stringiem ', który możesz zwrócić jako wartość zwracaną z metody, na przykład). –

16

Jeśli rzeczywiście mają wektor bajtów (Vec<u8>) i chcesz przekonwertować do String, najbardziej efektywne jest wykorzystanie alokacji z 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

Dzięki! Dlaczego dwie pozostałe odpowiedzi ignorują pytanie? – Jehan

+0

@Jehan, ponieważ ludzie zazwyczaj nie są dobrzy w zadawaniu pytań, zwłaszcza gdy są nowicjuszami w danym języku. Rust wprowadza rozróżnienie między * array *, a * slice * i * 'Vec' *, ale nowi użytkownicy nie znają różnic. Upewnij się jednak, że wszystkie pytania i odpowiedzi są przydatne. – Shepmaster

Powiązane problemy