rust - 如果文件不包含有效的 UTF-8,我如何获取文件的内容
问题描述
我需要获取 a 的内容.jsp
,我一直在使用std::fs::read_to_string
:
if f.file_name() == "entry.jsp" {
// read_file(f.path().to_str().unwrap());
println!("{:?}", f.file_name());
let contents = fs::read_to_string(f.path()).expect("Something went wrong reading the file");
}
但我收到以下错误:
“流不包含有效的 UTF-8”
我尝试std::io::BufReader
逐行读取文件,但我不知道如何将这些行作为字符串获取。
fn read_file(path: &str) -> std::io::Result<()> {
let file = File::open(path)?;
let reader = BufReader::new(file);
for line in reader.lines() {
println!("{}", line?);
}
Ok(())
}
我怎样才能将内容作为String
?
谢谢。
解决方案
Rust中的字符串必须是 UTF-8,因此您无法以String
. 您可以做的是将文件读取为字节(例如使用 . read_to_end
),然后将字节转换为带有from_utf8_lossy
.
if f.file_name() == "entry.jsp" {
// read_file(f.path().to_str().unwrap());
println!("{:?}", f.file_name());
let file = File::open(path)?;
let mut buf = vec![];
file.read_to_end (&mut buf)?;
let contents = String::from_utf8_lossy (&buf);
}
但是请注意,正如名称的“有损”部分所暗示的那样,您获得的字符串将与文件的内容不同:
但是,并非所有字节切片都是有效的字符串:字符串必须是有效的 UTF-8。在此转换过程中,
from_utf8_lossy()
会将任何无效的 UTF-8 序列替换为U+FFFD REPLACEMENT CHARACTER
,如下所示:<</p>
如果您知道您的输入使用了除 UTF-8 之外的一些有效字符编码,还有其他解决方案:
from_utf16
如果您的文件使用 UTF-16(或 UCS-2)编码。- 用于其他字符编码的
encoding_rs
or板条箱。encoding
推荐阅读
- ionic4 - “FirebaseMessaging”类型上不存在属性“logEvent”
- c# - 打开 Unity 应用程序后如何获取从 URL 方案传递的值?
- c++ - 打印使用 C++ 中的新方法制作的二维数组
- python - 解析 1track ...关于点的信息
- javascript - 无法使用页码 URL 加载页面。:id carousel 出现一些错误
- django - 通过 API 进行 Django 身份验证
- javascript - ngx bootstrap datepicker 不支持纪元日期格式?
- ios - 在核心数据中获取 NSManagedObject 上下文时找不到 objectID 错误
- java - 来自 jdbc 请求的查询不会传递到数据库,而验证查询确实通过了,该怎么办?
- java - 如何将 jar 与配置文件一起打包为 docker 镜像