前段时间公司项目有一个需求,需要读取解析本地CSV文件,将里面的内容在画面上以selectbox的形式表现出来。读取CSV文件的时候就涉及到check处理了。
其中有一个check处理让我困扰了很久,就是判断读入的CSV文件的编码格式是否符合在Java中所设定的编码格式。如果在Java中进行CSV文件读入时所设定的编码格式为【Shift-JIS】,而本地CSV文件的保存编码格式为【UTF-8】,那么读入后的日文汉字就会出现乱码现象。
起初我以为能够有方法来准确地读取文件的编码格式,但随着调查的不断深入才了解到,没有任何一种方法是能够准确地获得文件的编码格式。所以一些共同jar包里的方法其实都是用概率来推测这个文件所属的编码格式。
最终,我选择了下面的icu4j来进行编码格式的获取。
<dependency>
<groupId>com.ibm.icu</groupId>
<artifactId>icu4j</artifactId>
<version>58.2</version>
</dependency>
/**
* 文字コードを取得
*
* @param aFile
* @return 文字コード
*/
public String getFileCharset(final File aFile) {
String encoding = null;
try {
Path path = Paths.get(aFile.getPath());
byte[] data = Files.readAllBytes(path);
CharsetDetector charsetDetector = new CharsetDetector();
charsetDetector.setText(data);
CharsetMatch charsetMatch = charsetDetector.detect();
encoding = charsetMatch.getName();
} catch (IOException e) {
// なし
}
return encoding;
}
经过简单的测试发现,同一文本进行读入,如果我删掉了一行数据,那么最终获取的编码格式会发生变化。所以最终这个check处理被pass了。
毕竟,甲方就是上帝嘛。。。