首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在读取文本文件时去掉Byte Order标记(BOM)

如何在读取文本文件时去掉Byte Order标记(BOM)
EN

Stack Overflow用户
提问于 2021-11-21 10:34:16
回答 1查看 338关注 0票数 1

我试图使用xml-rs库读取生锈中的XML文件。但是,当读取文件时,它会对消息:Unexpected characters outside the root element感到恐慌。

我发现这是因为文件中存在'BOM‘(字节顺序标记)。我如何摆脱这个BOM,这样我才能读取我的文件?该库的作者引用了另一个库bom_remover,我在任何地方都找不到它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-21 10:49:50

下面是我如何做到这一点的:

  • 检测该文件是否具有BOM (我们不应该破坏没有BOM的文件)
  • 打开用于读取
  • 的文件,读取传递到XML解析库

的文件

  • 的这些头字节

为了检测文件是否有BOM,我使用了unicode-bom库(unicode-bom = "1.1.4"cargo.toml依赖项中)。

代码语言:javascript
复制
// detect BOM
let bom = getbom(&filepath);

let file = File::open(&filepath).unwrap();
let mut reader = BufReader::new(file);

// skip BOM (for now assume always 3 bytes)
if bom != Bom::Null {
    let mut x = [0; 3];
    let _y = reader.read_exact(&mut x);
}

// Parse file using - in this example - the georust/gpx library (which requires a BufReader)
let res: Result<Gpx, GpxError> = read(reader);

加上一个打开文件的简单函数,获取bom信息并再次关闭它:

代码语言:javascript
复制
fn getbom(path: &str) -> Bom {
    let mut file = File::open(path).unwrap();
    Bom::from(&mut file)
}

这段代码也可以通过处理2字节的BOM来改进&当然,也是正确的错误处理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70053706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档