我正在创建一个简单的 HTTP 服务器。我需要读取请求的图像并将其发送到浏览器。我正在使用这段代码:
fn read_file(mut file_name: String) -> String {
file_name = file_name.replace("/", "");
if file_name.is_empty() {
file_name = String::from("index.html");
}
let path = Path::new(&file_name);
if !path.exists() {
return String::from("Not Found!");
}
let mut file_content = String::new();
let mut file = File::open(&file_name).expect("Unable to open file");
let res = match file.read_to_string(&mut file_content) {
Ok(content) => content,
Err(why) => panic!("{}",why),
};
return file_content;
}
如果请求的文件是基于文本的,则此方法有效,但是当我想读取图像时,我会收到以下消息:
流不包含有效的 UTF-8
这是什么意思以及如何解决?
The 的文档String https://doc.rust-lang.org/std/string/struct.String.html将其描述为:
UTF-8 编码的可增长字符串。
The 维基百科对 UTF-8 的定义 https://en.wikipedia.org/wiki/UTF-8将为您提供大量关于这是什么的背景知识。简而言之,计算机使用一个称为byte https://en.wikipedia.org/wiki/Byte来表示数据。不幸的是,这些用字节表示的数据块没有内在意义;必须从外部提供。 UTF-8 是解释字节序列的一种方式,就像文件格式一样JPEG https://en.wikipedia.org/wiki/JPEG.
与大多数文本编码一样,UTF-8 具有特定的要求和字节序列valid and invalid。无论您尝试加载什么图像,都包含无法解释为 UTF-8 字符串的字节序列;这就是错误消息告诉您的内容。
要修复它,您不应该使用String
保存任意字节集合。在 Rust 中,最好用Vec https://doc.rust-lang.org/std/vec/struct.Vec.html:
fn read_file(mut file_name: String) -> Vec<u8> {
file_name = file_name.replace("/", "");
if file_name.is_empty() {
file_name = String::from("index.html");
}
let path = Path::new(&file_name);
if !path.exists() {
return String::from("Not Found!").into();
}
let mut file_content = Vec::new();
let mut file = File::open(&file_name).expect("Unable to open file");
file.read_to_end(&mut file_content).expect("Unable to read");
file_content
}
稍微宣传一下,这是 Rust 成为一门好语言的一个重要方面。因为有一种类型表示“保证是有效 UTF-8 字符串的一组字节”,所以我们可以编写更安全的程序,因为我们知道这个不变量将始终为真。我们不必在整个程序中不断检查以“确保”它仍然是一个字符串。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)