windows下的部分文本文件包含 BOM 头信息,经常导致乱码问题

BOM来源

用 windows 创建一个文本文件, 保存时指定字符集为 UTF-8 就自动包含 BOM 头信息了

查看文件字符集

使用 vim 可以查看文件字符集(安装了powerline插件),这里直接可以看到是 dos 的 utf-16e 文本文件
vim查看字符集 或者进入 vim 命令模式::set encoding 也是可以查看或者设置字符集的

linux 使用 file 命令查看文件字符集:

# linux  (mac系统为: file -I 100_bom.txt)
$ file -i 100_bom.txt
100_bom.txt: text/plain; charset=utf-16le

java处理掉开头的BOM

import java.io.*;

public class UTF8ToAnsiUtils {
    // FEFF because this is the Unicode char represented by the UTF-8 byte order mark (EF BB BF).
    public static final String UTF8_BOM = "\uFEFF";

    public static void main(String args[]) {
        String path = "/path/100_bom.txt";

        try {
            int index = 0;
            FileInputStream fis = new FileInputStream(path);
            // 100_bom.txt 这里的编码为: utf-16le
            BufferedReader r = new BufferedReader(new InputStreamReader(fis, "utf-16le"));
            for (String s = ""; (s = r.readLine()) != null; ) {
                if (index++ == 0) s = UTF8ToAnsiUtils.removeUTF8BOM(s);
                System.out.println("line:" + index + " - " + s);
            }

            r.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static String removeUTF8BOM(String s) {
        if (s.startsWith(UTF8_BOM)) {
            s = s.substring(1);
        }
        return s;
    }
}

参考:



blog comments powered by Disqus

Published

23 May 2017

Tags