You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将Rust中的&[u8]字节数组转换为std::string::String?

将&[u8]转换为Rust的String类型

嘿,这个问题其实比你想的简单——毕竟&[u8]Vec<u8>本质上都是字节序列,只是前者是切片而已。下面分两种常见场景给你讲清楚怎么转:

场景1:确定字节是合法的UTF-8编码

如果你百分百确认你的字节数组是标准UTF-8编码(比如从合法文本文件读取、或者是程序内部生成的UTF-8字节),可以用str::from_utf8方法先把切片转成&str,再调用to_string()得到String

use std::str;

fn main() {
    let bytes: &[u8] = b"Hello, Rust!"; // 示例UTF-8字节切片
    let result = match str::from_utf8(bytes) {
        Ok(valid_str) => valid_str.to_string(),
        Err(error) => panic!("字节序列不是合法UTF-8: {}", error),
    };
    println!("转换后的字符串: {}", result);
}

如果你的代码逻辑能保证绝对不会出现非法UTF-8(比如硬编码的字节数组),也可以直接用unwrap()简化代码:

let bytes: &[u8] = b"Hello, Rust!";
let s = str::from_utf8(bytes).unwrap().to_string();

场景2:字节可能包含非法UTF-8序列

如果你的字节数组来源不确定(比如用户上传的文件、网络数据),可能存在非法UTF-8字节,这时候用String::from_utf8_lossy会更安全——它会自动把非法的UTF-8序列替换成(U+FFFD替换字符),避免程序panic:

fn main() {
    let bytes: &[u8] = &[0xff, 0x80, 0x68, 0x65, 0x6c, 0x6c, 0x6f]; // 前两个字节是非法UTF-8
    let lossy_str = String::from_utf8_lossy(bytes);
    let s = lossy_str.to_string();
    println!("容错转换后的字符串: {}", s); // 输出 "��hello"
}

from_utf8_lossy返回的是Cow<'_, str>类型——如果字节序列完全合法,它会直接借用切片(避免内存拷贝);如果有非法字节,才会创建新的String存储替换后的内容。调用to_string()可以统一转换成String类型。

内容的提问来源于stack exchange,提问作者Qwertie

火山引擎 最新活动