【问题标题】:Import csv issue with characters导入带有字符的csv问题
【发布时间】:2018-06-17 07:35:37
【问题描述】:

当我导入包含某些国家/地区的 CSV 文件时,我遇到了某些字符的问题。它没有很好地编码,然后我得到了?标记而不是写入 CSV 文件中的字符。 以下是让我遇到问题的国家:奥兰群岛、圣巴泰勒米、科特迪瓦、库拉恰。

这里是导入csv文件的代码:

ICsvBeanReader beanReader = new CsvBeanReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8),
                    new CsvPreference.Builder(CsvPreference.STANDARD_PREFERENCE).useQuoteMode(new AlwaysQuoteMode()).build());

首先我使用 FileReader 并且所有这些国家都存在问题,然后我更改为 InputStreamReader 并添加此 UTF-8 字符集,问题几乎解决了。当我使用字符集 UTF-8 时,我只在阅读这个国家“ÅLAND ISLANDS”时遇到问题,结果我得到“?LAND ISLANDS”。 作为字符集,我也尝试过 ISO_8859_1、Windows-1252,但“ÅLAND ISLANDS”总是出现同样的问题。

有谁知道我应该使用哪个字符集来解决这个问题?

【问题讨论】:

  • 你知道csv文件是怎么编码的吗?只需将其与字符集匹配即可。
  • 也可以试试InputStreamReader(new FileInputStream(file), "UTF8"))
  • 看来这不是编程问题,而是文件的编码问题。您应该确保您的文件源使用正确的编码。从你的问题看来,部分是用 UTF8 编码的,而其他部分是用 ANSI 或其他东西编码的。
  • 如果你真的想找出哪些字符集看起来不错,你可以遍历 StandartCharsets 枚举,每次选择下一个并使用它来解析 csv,然后打印有问题的字符串和字符集名称- 在那里你会看到哪一个有效
  • @GuyKhmel 文件使用 UTF-8 进行编码,我尝试使用“UTF8”,但它也无法正确读取“ÅLAND ISLANDS”。

标签: java csv character-encoding


【解决方案1】:

Java 文件阅读器不处理字节顺序标记。我希望这就是问题所在。

不同版本的处理方式不同。

使用以下方法包装输入流。该方法检测文件类型。该方法在 commons-io 中可用。如果您没有该库中的 commons-io 抓取代码。它将大约 10 到 20 行。希望行得通。

    public static InputStreamReader getInputStreamReader(InputStream inputStream) throws IOException
    {
        BOMInputStream bOMInputStream = new BOMInputStream(inputStream, false, ByteOrderMark.UTF_8,
               ByteOrderMark.UTF_16BE, ByteOrderMark.UTF_16LE,
               ByteOrderMark.UTF_32BE, ByteOrderMark.UTF_32LE);
        ByteOrderMark bom = bOMInputStream.getBOM();
        String charsetName = bom == null ? "UTF-8" : bom.getCharsetName();
        return new InputStreamReader(bOMInputStream, charsetName);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多