在 Rust 中将 ascii 数组转换为字符串的惯用方法

Wol*_*ehn 5 string char rust

我想使用 ASCII 编码将字节数组转换为字符串。解决方案

fn main() {
    let buffer: [u8; 9] = [255, 255, 255, 255, 77, 80, 81, 82, 83];
    let s = String::from_iter(buffer[5..9].iter().map(|v| { *v as char }));
    println!("{}", s);
    assert_eq!("PQRS", s);
}
Run Code Online (Sandbox Code Playgroud)

看起来不太惯用,有一股性能不佳的味道。我们可以做得更好吗?没有外部板条箱吗?

Sir*_*ius 4

Rust 字符串可以直接从 UTF-8 编码的字节缓冲区创建,如下所示:

fn main() {
    let buffer: [u8; 9] = [255, 255, 255, 255, 77, 80, 81, 82, 83];
    let s = std::str::from_utf8(&buffer[5..9]).expect("invalid utf-8 sequence");
    println!("{}", s);
    assert_eq!("PQRS", s);
}
Run Code Online (Sandbox Code Playgroud)

如果输入缓冲区包含无效的 UTF-8 序列,则操作可能会失败,但 ASCII 字符是有效的 UTF-8,因此在这种情况下它可以工作。

请注意,这里 的类型s&str,这意味着它是对 的引用buffer。这里没有进行分配,因此操作非常高效。

查看实际效果:Playground 链接

  • 因此,解决方案更多地涉及 UTF-8:_ASCII 字符是有效的 UTF-8_。我不知道。 (2认同)
  • 这是对的。这甚至是UTF-8最初的设计目标之一。向后兼容 ASCII。 (2认同)