文本内容头BOM

问题

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

package xxx

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

illegal character '\ufeff'
package xxx

解决方法

由with BOM修改为无

文本内容头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
...

上一篇:【高程3】8 BOM - 重读随笔


下一篇:JS BOM事件