2013-09-29 21 views

risposta

42

Per convertire una fetta di byte di una fetta stringa (ipotizzando una codifica 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); 
} 

La conversione è sul posto, e non richiede un'allocazione. È possibile creare uno String dalla sezione, se necessario.

Il riferimento libreria per la funzione di conversione:

+0

si consiglia di aggiungere che questo è possibile perché Vec costruisce a fette – torkleyy

+0

anche se il codice di esempio in realtà non usa un vettore :-) –

26

preferisco String::from_utf8_lossy:

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

Si scopre non validi byte UTF-8 nella Comunità e quindi non la gestione degli errori è obbligatorio. Fa bene quando non ne hai bisogno e non ne ho proprio bisogno. In questo caso ricevi uno String. Dovrebbe rendere la stampa di quello che stai ricevendo dal server un po 'più facile.

A volte potrebbe essere necessario utilizzare il metodo into_owned() poiché è clonazione in scrittura.

+2

Grazie mille per il suggerimento 'in_owned()'! Era esattamente quello che stavo cercando (questo fa diventare un 'String' appropriato che puoi restituire come valore di ritorno da un metodo, per esempio). –

16

Se effettivamente avete un vettore di byte (Vec<u8>) e si desidera convertire a un String, la più efficiente è quello di riutilizzare l'assegnazione con 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

Grazie! Perché le altre due risposte ignorano la domanda? – Jehan

+0

@Jehan perché in genere le persone non sono brave a fare domande, soprattutto quando sono nuove in una lingua. Rust fa una distinzione tra un * array *, un * slice * e un * 'Vec' *, ma i nuovi arrivati ​​non conoscono le differenze. Assicurati di superare tutte le domande e le risposte che si rivelano comunque utili. – Shepmaster

Problemi correlati