判断csv文件字符编码类型的方法

查了很久,百度上出现的答案都实现不了我的需求,最后不得不使用AI神器通义千问,在回答的建议提问里找到了icu4j,这jar包名字对软件工程师来说好可怕,记录一下以免后来者重蹈覆辙。

使用apche的io包判断pom不靠谱,建议使用了IBM的包icu4j

  • 引入icu4j依赖
        <dependency>
            <groupId>com.ibm.icu</groupId>
            <artifactId>icu4j</artifactId>
            <version>70.1</version>
        </dependency>
  • 编写工具类
public class CharsetEncodingUtils {
    public static String getCharset(InputStream in) throws IOException {
        String charset = null;
        BufferedInputStream bis = null;
        try {
            bis = new BufferedInputStream(in);
            CharsetDetector cd = new CharsetDetector();
            cd.setText(bis);
            CharsetMatch cm = cd.detect();
            if (cm != null) {
                charset = cm.getName();
            } else {
                throw new UnsupportedCharsetException("获取文件编码失败");
            }
        } catch (IOException e) {
            e.printStackTrace();
            throw new IOException(e);
        }finally {
            if (null != bis) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != in) {
                in.close();
            }
        }

        return charset;
    }

    public static void main(String[] args) {
        File file = new File("/Users/xxxxx/Documents/批量添加验证样本模板111/上传文件样例-表格 1.txt");
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(file);
            String charset = getCharset(inputStream);
            System.out.println("charset:" + charset);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (null != inputStream) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
  • 测试case
    以下是我做的16个case,使用16种字符编码的文件,通过icu4j来获取文件的字符编码,目前测试来看只要源文件的中文能正常显示,使用icu4j读取到的编码就能正常解析,同时将解析到的内容以UTF-8的编码输出到新的文件,也没问题。
输入文件字符编码ICU4J读取文件字符编码输出UTF-8备注
ANSIGB18030中文转码通过
BOM UTF-8UTF-8中文转码通过
UTF-16BEUTF-16BE中文转码通过
UTF-16BE with BOMUTF-16BE中文转码通过
UTF-16LEUTF-16LE中文转码通过
UTF-16LE with BOMUTF-16LE中文转码通过
UTF-8UTF-8中文转码通过
UTF-7ISO-8859-1中文转码未通过源文件中文已经乱码
UTF-32UTF-32LE中文转码通过
UTF-32BEUTF-32BE中文转码通过
UTF-32LEUTF-32LE中文转码通过
GB 18030GB18030中文转码通过
GBKGB18030中文转码通过
ISO 2022-CNISO-2022-CN中文转码通过源文件中文已经乱码
DOS Latin 2ISO-8859-1中文转码未通过源文件中文已经乱码
ASCLLISO-8859-1中文转码未通过源文件中文无法显示,被ASCLL编码

参考 icu4j解决获取文件编码问题 - 简书

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值