0

我正在使用 Spring Boot REST API 上传 csv 文件 MultipartFile。org.apache.commons.csv 的CSVFormat 库用于格式化MultipartFile,CSVParser 用于解析并将迭代的记录存入MySql 数据库。

csvParser = CSVFormat.DEFAULT
            .withDelimiter(separator)
            .withIgnoreSurroundingSpaces()
            .withQuote('"')
            .withHeader(CsvHeaders.class)
            .parse(new InputStreamReader(csvFile.getInputStream()));

观察结果是,当使用 UTF-8 字符集上传 CSV 文件时,它运行良好。但是如果 CSV 文件是其他格式(ANSI 等),它会将德语和其他语言字符编码为一些随机符号。

示例 äößü 被编码为 ����

我尝试了以下方法来指定编码标准,它也不起作用。

        csvParser = CSVFormat.DEFAULT
            .withDelimiter(separator)
            .withIgnoreSurroundingSpaces()
            .withQuote('"')
            .withHeader(CsvHeaders.class)
            .parse(new InputStreamReader(csvFile.getInputStream(), StandardCharsets.UTF_8));

你能给些建议么。非常感谢你。

4

2 回答 2

2

你所做new InputStreamReader(csvFile.getInputStream(), StandardCharsets.UTF_8)的告诉 CSV 解析器输入流的内容是 UTF-8 编码的。由于 UTF-8 (通常)是标准编码,这实际上与使用new InputStreamReader(csvFile.getInputStream()).

如果我正确地回答了您的问题,那么这不是您想要的。相反,您想根据导入文件自动选择正确的编码,对吗?不幸的是,csv 格式不存储使用哪种编码的信息。您可以使用一些库来根据文件中包含的字符猜测最可能的编码。虽然它们非常准确,但它们仍在猜测,并且不能保证您最终会得到正确的编码。

根据您的用例,可能更容易就固定编码与消费者达成一致(即他们可以上传 UTF-8 或 ANSI,但不能同时上传)

于 2021-04-08T14:45:03.493 回答
0

尝试如下所示,这对我来说适用于同样的问题

new InputStreamReader(csvFile.getInputStream(), "UTF-8")
于 2021-04-08T14:10:23.027 回答