Как преобразовать Vec в другой тип данных?

Как можно правильно конвертировать фрагменты байт, полученные из файла и сохраненные в переменной u, так чтобы получилась корректная строка? Например, фрагмент u01 успешно конвертируется, а u02 нет. Код для примера:

```rust
let u = fs::read("/../text.txt").expect("error on handling file");
fn main() {
      let u01: Vec<u8> = vec![49, 48, 55];
      let u02: Vec<u8> = vec![210, 232, 239];
      println!("u01 = {:?}", std::str::from_utf8(&u01[..]).unwrap());  //    "107"
      println!("u02 = {:?}", std::str::from_utf8(&u02[..]).unwrap());  // ?  "Тип"
  }
```
  • 4 января 2024 г. 14:18
Ответы на вопрос 1
Чтобы преобразовать `Vec<u8>` в строку, вы можете использовать метод `std::str::from_utf8()`, который пытается интерпретировать вектор байтов как строку в кодировке UTF-8. В случае успешного преобразования метод вернет `Ok(&str)`, но если байты не являются валидной последовательностью UTF-8, будет возвращена ошибка.

Процедура преобразования проста:

```rust
fn main() {
    let u01: Vec<u8> = vec![49, 48, 55];
    let u02: Vec<u8> = vec![208, 162, 208, 184, 208, 191];

    // Преобразование u01
    match std::str::from_utf8(&u01) {
        Ok(string) => println!("u01 = {}", string),
        Err(e) => println!("u01 conversion error: {}", e),
    }

    // Преобразование u02
    match std::str::from_utf8(&u02) {
        Ok(string) => println!("u02 = {}", string),
        Err(e) => println!("u02 conversion error: {}", e),
    }
}
```

В данном примере я изменил значения в `u02` на корректную последовательность байтов, представляющих строку "Тип" в кодировке UTF-8. Ваши исходные байты в `u02` (`[210, 232, 239]`) не представляют собой валидную UTF-8 строку.

Важно помнить, что Rust работает с UTF-8 символами, так что если у вас есть строка в другой кодировке (например, Windows-1251, ISO-8859-1 и прочие), вам нужно будет сначала преобразовать её в UTF-8. Для таких операций можно использовать внешние библиотеки, такие как `encoding_rs` или `encoding`.

Чтобы обработать чтение файла и преобразование его содержимого в строку, можно использовать такой код:

```rust
use std::fs;

fn main() {
    let u = fs::read("text.txt").expect("error on handling file");
    
    // Преобразование содержимого файла в строку
    match std::str::from_utf8(&u) {
        Ok(string) => println!("File content: {}", string),
        Err(e) => println!("File conversion error: {}", e),
    }
}
```

Если байты в файле не представляют валидную UTF-8 строку, вам потребуется использовать другой способ декодирования содержимого, исходя из кодировки файла.
Похожие вопросы