Rust中如何将Microsoft DOS编码页OEM 737转换为UTF-8
解决方案
你当前代码触发panic的核心原因是Rust标准库的BufReader::lines()方法默认仅支持UTF-8编码,遇到OEM-737这类非UTF-8编码的字节序列时就会抛出错误。
你可以通过encoding_rs和encoding_rs_io两个成熟的编码处理库实现编码转换,操作步骤如下:
- 首先在
Cargo.toml中添加依赖项:
[dependencies] encoding_rs = "0.8" encoding_rs_io = "0.1"
- 修改你的
get_lines函数,新增编码转换逻辑:
use std::fs::File; use std::io::{BufRead, BufReader}; use encoding_rs::WINDOWS_737; use encoding_rs_io::DecodeReaderBytesBuilder; fn get_lines(file: &str) -> Vec<String> { let mut lines: Vec<String> = Vec::new(); let file = File::open(file).expect("读取文件失败"); // 构建OEM-737到UTF-8的解码流 let decode_reader = DecodeReaderBytesBuilder::new() .encoding(Some(WINDOWS_737)) .build(file); let reader = BufReader::new(decode_reader); for line in reader.lines() { lines.push(line.unwrap()); } lines }
补充说明
- 默认配置下,遇到编码中不可映射的异常字节会自动用�替代,不会触发panic。如果需要严格校验编码合法性,可以在构建解码流时通过
malformed_callback方法自定义错误处理逻辑。 - 如果你不想引入第三方依赖,也可以自行查询OEM-737编码与Unicode的映射表,手动完成字节到UTF-8字符的转换,不过开发效率会低于直接使用成熟库。
内容的提问来源于stack exchange,提问作者Vasilis Kalfas
相关产品推荐
相关产品推荐

