使用字符

时间:2018-01-08 10:26:03

标签: java csv character-encoding

当我导入包含某些国家/地区的CSV文件时,我遇到了一些问题。它编码不好然后我得到了?标记而不是CSV文件中写入的字符。 以下是使我成为这个问题的国家:ÅLANDISLANDS,SAINTBARTHÉLEMY,CÔTED'IVOIRE,CURAÇAO。

以下是导入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我只有阅读这个国家“ÅLANDISLANDS”的问题,结果我得到“?LAND ISLANDS”。 作为charset我也尝试过ISO_8859_1,Windows-1252,但它与“ÅLANDISLANDS”一直存在同样的问题。

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

1 个答案:

答案 0 :(得分:0)

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

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

使用以下方法包装输入流。哪个检测文件类型。这个方法可以在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);
    }