文本内容头BOM

38 篇文章 1 订阅
本文讨论了在运行代码时遇到的非法字符''错误,该错误通常是由于UTF-8文件带有BOM(字节顺序标记)引起的。解决方法是将文件保存为不带BOM的UTF-8格式。BOM在不同Unicode编码中有不同表示,如UTF-16的FEFF和UTF-8的EFBBBF。通过识别文件头部的字节,可以确定文件的编码类型。提供了一个读取文件并检测BOM的示例代码。
摘要由CSDN通过智能技术生成

问题

运行如下代码及产生的错误 

package xxx

object RedisMain {
  def main(args: Array[String]): Unit = {
    println("aa")
  }
}

illegal character '\ufeff'
package xxx

解决方法

由with BOM修改为无

 重新创建文件代码再copy运行,成功

通常把文件保存为不带BOM的UTF-8文件

BOM

介绍

BOM是用来判断文本文件是哪一种Unicode编码的标记,其本身是一个Unicode字符("\uFEFF"),位于文本文件头部。

字节顺序标记(英语:byte-order mark,BOM)是位于码点U+FEFF的统一码字符的名称。当以UTF-16或UTF-32来将UCS/统一码字符所组成的字串编码时,这个字符被用来标示其字节序。它常被用来当做标示文件是以UTF-8、UTF-16或UTF-32编码的记号。

在不同的Unicode编码中,对应的bom的二进制字节如下:
FE FF UTF16BE
FF FE UTF16LE
EF BB BF UTF8
可以根据文件头部的几个字节和上面的表格对应来判断该文件是哪种编码形式。

use std::env;
use std::fs::File;
use std::io::{prelude, Read};

fn main() -> std::io::Result<()> {
    let mut param = env::args();

    if param.len() != 2 {
        return Err(std::io::Error::new(
            std::io::ErrorKind::Other,
            "usage: input file path which contains bom",
        ));
    }
    let a = param.next();
    println!("a = {:?}", a);
    let input_file_path = param.next();
    let mut input_file = File::open(input_file_path.unwrap())?;
    let mut buffer = [0u8; 16];
    while let std::io::Result::Ok(len) = input_file.read(&mut buffer) {
        if len == 0 {
            break;
        } else {
            for i in 0..len {
                // print!("{:02x}", i);
                print!("{:X}", buffer[i]);
            }
            println!("\r");
        }
    }

    Ok(())
}
EFBBBF2F2F7061636B61676520636F6D
2E626C2E626967646174612E6364705F
...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大怀特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值