判断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解决获取文件编码问题 - 简书

查看CSV文件编码类型通常取决于你使用的编程语言。以下是几种常见编程语言中检查CSV文件编码的方式: 1. **Python (pandas)**: 使用`pandas`库可以轻松地读取文件并查看其默认编码: ```python import pandas as pd df = pd.read_csv('file.csv') print(df.info()) ``` 或者直接通过 `chardet` 库检测: ```python import chardet with open('file.csv', 'rb') as f: encoding_guess = chardet.detect(f.getvalue())['encoding'] ``` 2. **JavaScript (Node.js)**: 使用`fs` 和 `iconv-lite`库: ```javascript const fs = require('fs'); const iconv = require('iconv-lite'); let data = fs.readFileSync('file.csv', 'binary'); try { const result = iconv.decode(data, 'ascii'); console.log(result); } catch (error) { console.log('Not ASCII'); } ``` 3. **Java (OpenCSV)**: 使用`OpenCSV`库,你可以读取完数据后再检查编码: ```java CSVReader reader = new CSVReader(new FileReader("file.csv")); String[] line; while ((line = reader.readNext()) != null) { // 检查当前行是否全为英文字符,作为判断依据 if (!line.contains("\u0000")) { // \u0000代表非ASCII字符 System.out.println("File seems to be ASCII"); break; } } ``` 4. **Visual Studio Code**: 安装了插件如"VSCode Text File Encoding Detector"后,右键点击CSV文件,在"首选项 > 扩展"菜单下选择该插件,它会自动检测文件编码。 5. **命令行工具**: - Windows: 可能需要第三方工具如`Notepad++`的“Encoding Detection”功能。 - macOS/Linux: 可以使用`file`命令,例如 `file -I file.csv`,输出信息中通常包含编码类型。 请注意,如果文件编码不是文本模式,比如二进制数据,上述方法可能无法准确识别。对于这类情况,一般需要先手动确认或寻求专业的文件分析工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值