当我导入包含某些国家/地区的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”一直存在同样的问题。
有谁知道我应该使用哪个字符集来解决这个问题?
答案 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);
}