You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中如何将Microsoft DOS编码页OEM 737转换为UTF-8

解决方案

你当前代码触发panic的核心原因是Rust标准库的BufReader::lines()方法默认仅支持UTF-8编码,遇到OEM-737这类非UTF-8编码的字节序列时就会抛出错误。

你可以通过encoding_rs和encoding_rs_io两个成熟的编码处理库实现编码转换,操作步骤如下:

  1. 首先在Cargo.toml中添加依赖项:
[dependencies]
encoding_rs = "0.8"
encoding_rs_io = "0.1"
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:21:00