Java获取文本文件字符编码的两种方法

2023-11-12

  

Java判断文本文件字符编码的两种方法:1、通过文件流的前面部分字节判断;2、通过cpdetector库提供的监听方法来判断。

1、取文件流方式

    public static String codeString(String fileName) throws Exception {
        BufferedInputStream bin = new BufferedInputStream(new FileInputStream(fileName));
        int p = (bin.read() << 8) + bin.read();
        bin.close();
        String code = null;
 
        switch (p) {
        case 0xefbb:
            code = "UTF-8";
            break;
        case 0xfffe:
            code = "Unicode";
            break;
        case 0xfeff:
            code = "UTF-16BE";
            break;
        default:
            code = "GBK";
        }
 
        return code;
    }

该方法一般情况是可以正常运行的,但对有些文件却不生效,不能获取正确的编码,故而可采取如下方法。

2、使用cpdetector库

使用Cpdetector jar包检测文件编码需要依赖antlr-2.7.4.jar、chardet-1.0.jar、jargs-1.0.jar三个jar包,可以到官网cpdetector, free java code page detection.下载 。

详细的使用可以参考官网,简单的代码示例如下:

	/**
	 * <div>
	 * 利用第三方开源包cpdetector获取文件编码格式.<br/>
	 * --1、cpDetector内置了一些常用的探测实现类,这些探测实现类的实例可以通过add方法加进来,
	 *   如:ParsingDetector、 JChardetFacade、ASCIIDetector、UnicodeDetector. <br/>
	 * --2、detector按照“谁最先返回非空的探测结果,就以该结果为准”的原则. <br/>
	 * --3、cpDetector是基于统计学原理的,不保证完全正确.<br/>
	 * </div>
	 * @param filePath
	 * @return 返回文件编码类型:GBK、UTF-8、UTF-16BE、ISO_8859_1
	 * @throws Exception 
	 */
	public static String getFileCharset(String filePath) throws Exception {
		CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
		/*ParsingDetector可用于检查HTML、XML等文件或字符流的编码,
		 * 构造方法中的参数用于指示是否显示探测过程的详细信息,为false不显示。
	    */
		detector.add(new ParsingDetector(false));
		/*JChardetFacade封装了由Mozilla组织提供的JChardet,它可以完成大多数文件的编码测定。
		 * 所以,一般有了这个探测器就可满足大多数项目的要求,如果你还不放心,可以再多加几个探测器,
		 * 比如下面的ASCIIDetector、UnicodeDetector等。
        */
		detector.add(JChardetFacade.getInstance());
		detector.add(ASCIIDetector.getInstance());
		detector.add(UnicodeDetector.getInstance());
		Charset charset = null;
		File file = new File(filePath);
		try {
			//charset = detector.detectCodepage(file.toURI().toURL());
			InputStream is = new BufferedInputStream(new FileInputStream(filePath));
			charset = detector.detectCodepage(is, 8);
		} catch (Exception e) {
			e.printStackTrace();
			throw e;
		}

		String charsetName = "GBK";
		if (charset != null) {
			if (charset.name().equals("US-ASCII")) {
				charsetName = "ISO_8859_1";
			} else if (charset.name().startsWith("UTF")) {
				charsetName = charset.name();// 例如:UTF-8,UTF-16BE.
			}
		}
		return charsetName;
	}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java获取文本文件字符编码的两种方法 的相关文章

随机推荐

  • ubuntu16.04详细安装pytorch(GPU)

    安装pytorch要安装两个模块 torch和torchvision torch是主模块 用来搭建神经网络 torchvision是辅模块 里面有搭建好的网络可以直接用 1 安装pip3 ubuntu自带python3 5和2 7 所以没装
  • linux 设置静态 ip 或者 修改 DNS

    设置 linux 静态 ip 或者 添加DNS preface 操作步骤 1 执行命令 nmtui 2 确认设置是否成功 supplements 3 1 linux 中 子网掩码的表示 3 2 DNS 和 ip 设置 3 3 DHCP 协议
  • Ribbon负载均衡(一)Ribbon实战

    Ribbon实战 文章目录 Ribbon实战 1 注册中心 1 1 服务注册到注册中心 1 2 服务注册列表Ribbon负载均衡选取相应节点 2 负载均衡方案 2 1 集中式负载均衡 2 2 进程内聚在均衡 3 Ribbon实践 3 1 配
  • Onvif协议学习:14、球机云台控制PTZ

    Onvif协议学习 14 球机云台控制PTZ 文章目录 Onvif协议学习 14 球机云台控制PTZ 一 介绍 二 代码实现 八个方向 放下及缩小控制 聚焦控制 原文链接 https blog csdn net u013566528 art
  • 步进电机原理及驱动

    这里把步进电机的资料做个整合 文章目录 步进电机是什么 原理 定子 定子的种类 转子及其种类 工作方式 单拍方式 双拍方式 单双拍方式 通电方式 驱动器 驱动程序 步进电机是什么 什么是步进电机 步进电机是将电脉冲信号 转变为角位移或线位移
  • Nginx概念及应用

    Nginx 一 反向代理 概念 反向代理服务器位于用户与目标服务器之间 但是对于用户而言 反向代理服务器就相当于目标服务器 即用户直接访问反向代理服务器就可以获得目标服务器的资源 同时 用户不需要知道目标服务器的地址 也无需在用户端做任何设
  • 2023年2月浙江省中小企业协会与各专委会大事记

    1 1月13日上午 协会领导蔡章生带队走访国家绿色技术交易中心 调研绿色技术创新工作 与国家绿色技术交易中心副主任贺沛宇 中教能源研究院黄刚院长 线上视频参会 项目主管郦剑飞等进行座谈 研究推进 双碳 产业 EATNS碳管理体系建设以及节能
  • 计算机网络知识点总结——第二章物理层

    第二章 物理层 一 概述 重点概念 二 数据通信 一 数据模型 二 数据通信相关术语 三 三种通信方式 四 数据传输方式 五 同步传输 异步传输 六 小节脑图 七 码元 八 数字通信系统数据传输速率 码元传输速率 码元速率 波形速率 调制速
  • 知识体系之MySQL

    目录 前言 1 一条select是怎么执行的 1 1 连接器 1 1 1 连接器的工作 1 1 2 长 短连接 1 2 查询缓存 1 3 解析器 1 4 执行SQL 1 4 1 预处理器 1 4 2 优化器 1 4 3 执行器 2 一条up
  • mysql有numeric类型吗_mysql数值类型 - numeric

    本文介绍php出现Warning A non numeric value encountered问题 用实例分析出现这种错误的原因 并提供避免及解决问题的方法
  • Codeforces 1634 F. Fibonacci Additions —— 斐波那契数列加,想法

    This way 题意 给你长度为n的数组a和数组b 每次会有一个操作 x l r 如果x是A表示在数组a上进行操作 否则是b l r表示将区间 l r 的数一一对应加上斐波那契数列 1 r l 1 的数 问你最后a和b是否相等 题解 斐波
  • 【建议收藏】新到手的电脑Windows10/11系统优化、使用规范和技巧及软件推荐,提升范电脑性能和体验

    目录 一 了解电脑 1 查看电脑和系统的基本信息 2 电脑测评 二 Windows10 11系统优化及设置 1 控制面板 回收站等桌面图标显示设置 2 任务栏管理 3 桌面图标排列 4 卸载程序 5 关闭P2P分享 传递优化 6 电设置脑为
  • SSTI 绕过方法总结

    SSTI 绕过方法总结 学习绕过的重点是掌握一个技术的使用方法 这其中的许多方法 看起来好像就那样 但是实验起来 就会发现哪哪都碰壁 针对不同的过滤情况 我们可以先构造一个常规的 payload 然后再根据实际情况进行改造绕过 这个常规 p
  • 数字化升级里,RPA的下一步正在走向哪?

    如果说 API这种能力在2021年并未成为 刚需 那么在2022年其已经一跃成为RPA进入企业真正场景的 必需品 作者 斗斗 编辑 皮爷 出品 产业家 今年八月 调查机构Gartner发布了2022全球RPA魔力象限 数据显示 2021年
  • 科学实验中剔除坏值的方法--肖维勒准则法

    def Chauvenet v c 5 1 65 6 1 73 7 1 8 8 1 86 9 1 92 10 1 96 11 2 12 2 03 n len v ave getAve v stdDev getStdDev v if len
  • mac的find命令

    在mac上使用find查找某个文件夹下面的所有 md文件 find name md 在mac上报如下错误 find illegal option n 在stackoverflow上找到了答案 https stackoverflow com
  • DBus研究笔记(一)

    一 建立连接 要使用DBus进行通信必须首先与系统建立连接 并申请一个 域名 使得其他应用可以找到你 常用DBusConnection dbus bus get DBusBusType DBusError 系列函数来与bus daemon建
  • 关于C++中constexpr的用法

    在C 11 primer中 关于constexpr用法给出的解释是 允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式 声明为constexpr的变量一定是一个常量 而且必须用常量表达式初始化 第一句中 c
  • 冬来春往

    二月 我回来了 黄昏与日落 高山与河流 城镇与村庄 冷风 我感觉到了你透过车窗缝隙那透心凉的滋润 随着二月而来 又伴三月而去 二月 你游戏了我春去冬来的过往 如候鸟一般 俯瞰天南地北 归去来兮 候鸟 你是一种循着春节轻装上阵飞翔的姿态 天空
  • Java获取文本文件字符编码的两种方法

    Java判断文本文件字符编码的两种方法 1 通过文件流的前面部分字节判断 2 通过cpdetector库提供的监听方法来判断 1 取文件流方式 public static String codeString String fileName