使用哪种适当的编码与Item Reader配合使用?

7

我将使用Spring Batch来读取CSV文件,当我使用Notepad++打开这些文件时,我发现使用的编码是ANSI编码。现在,当从文件中读取一行时,我注意到所有的重音字符都没有正确显示。例如,让我们看一下这一行:

Données issues de la reprise des données

经过一些特殊字符的转换,它被转化为下面这个样子:

enter image description here

因此,我的第一种解决方案是将我的项目读取器编码设置为utf-8,但问题仍然存在。

  • 我认为使用UTF-8编码可以识别所有的重音字符,这不是真的吗?根据我所知,UTF-8是处理网页上所有字符的最佳编码方式?

在将我的项目读取器编码设置为ISO-8859-1之后:

public class TestItemReader extends FlatFileItemReader<TestFileRow> {

    private static final Logger log = LoggerFactory.getLogger(TestItemReader.class);
    public ScelleItemReader(String path) {

        this.setResource( new FileSystemResource(path + "/Test.csv"));
        this.setEncoding("ISO-8859-1");

我看不到这些字符现在被正确地显示。

  • 作为输出,我应该用utf-8作为编码来写,如果我使用ISO-8859-1作为输入编码和utf-8作为输出,这样做是正确的吗?

我的问题是,为什么当我尝试将itemReader编码设置为utf-8时仍然存在?嗯,因为文件不是UTF-8格式。说实话,你的问题不太清楚。 - Jon Skeet
我更新了帖子。 - Feres.o
我怀疑您不理解编码的工作原理。如果一个文件是使用ISO-8859-1编码的,而您尝试使用UTF-8读取它,这有点像尝试使用PNG阅读器加载JPEG图像。UTF-8可以表示Unicode中的每个字符,但这并不意味着您可以随意将其用于使用不同编码的文件。 - Jon Skeet
1
好的,“ANSI” 也不是单一的编码方式。如果您可以更改生成 CSV 文件的源以输出 UTF-8 编码,那将是最好的选择。但如果您无法更改,请查找它正在使用的编码方式(而不仅仅依赖于 Notepad++)。 - Jon Skeet
非常感谢您的帮助和解释。 - Feres.o
显示剩余2条评论
2个回答

5
我遇到了同样的问题。输入文件是ANSI编码,而“ü”在输出中显示为方块。
这是因为你的输入文件是以ANSI编码保存的,但是默认情况下,Spring Batch假设使用ISO-8859-1编码(6.6.2 FlatFileItemReader)。 2023年更新:在较新的版本中,默认编码为UTF-8,但是在问题发布时,默认编码为ISO-8859-1,可以通过查看链接文档的旧版本进行验证;例如,版本4.0.1.RELEASE。我不确定当时的当前版本是哪个,但无论如何,要点都是一样的。
因此,你需要将读取器的编码设置为"Cp1252"(setEncoding("Cp1252"))- 这是Java对ANSI编码的称呼。
此外,您需要将编码设置为“utf-8”。我不完全确定为什么它不能与其他编码一起使用(通常能够显示“ü”的编码,如ISO-8859-1),但它可以与UTF-8一起使用,所以这就是我使用的编码。

默认的编码方式在FlatFileItemReader中是UTF-8,根据您分享的文档。如果我说错了,请纠正我。 - ankush__
你是对的 @ankush__ ,AbstractFileItemWriter 中设置的默认编码是 utf-8。 - Guardian
@ankush__ 我已经好几年没有使用Spring Batch了,但我认为自从2018年我最初写下这个答案以来,默认设置已经发生了变化。检查链接文档的旧版本可以证实这一点。例如,Spring Batch 4.0.1 RELEASE 版本显示默认编码为ISO-8859-1:https://docs.spring.io/spring-batch/docs/4.0.1.RELEASE/reference/html/readersAndWriters.html#readersAndWriters - PixelMaster
谢谢。你说得对,编码默认值已经改变了。 - ankush__

0

我使用相同的编码“ISO-8859-1”,所有字符都能正确显示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接