今天在使用Java版GIS开源工具GeoTools读取ShapeFile文件,其中ShapeFile的dbf文件(属性表)中的属性为中文字符,按照官方的案例读取结果显示为乱码。
原始的代码为:

/**
* @description: 使用GeoTools库读取ShapeFile文件
* @author Zhenyu Tan
* @date 2016年8月9日 下午10:15:09
* @version
public class ShapeFileReader
public static void main(String[] args) throws Exception {
String filePath = "F:/2016/Data/中国/China/China.shp";
File shapeFile = new File(filePath);

FileDataStore dataStore = FileDataStoreFinder.getDataStore(shapeFile);
// 设置编码后可以正确读取
//((ShapefileDataStore) dataStore).setCharset(Charset.forName("GBK"));
SimpleFeatureSource featureSource = dataStore.getFeatureSource();
SimpleFeatureIterator featureIter = featureSource.getFeatures().features();

// 利用SimpleFeature的迭代器,依次遍历所有的SimpleFeature并输出其属性值
while (featureIter.hasNext()) {
SimpleFeature feature = featureIter.next();
List<Object> attributes = feature.getAttributes();
for

原因分析:
通过查看ShapefileDataStore的源码可以发现:GeoTools读取ShapeFile文件的默认编码为ISO-8859-1。而我们中文操作系统下ShapeFile文件的默认编码一般为GBK,所以只要告诉ShapefileDataStore使用GBK编码进行解析就OK了。

解决方案一:
设置ShapefileDataStore的解码方式(上面代码片段中以注释的方式给出):

​((ShapefileDataStore) dataStore).setCharset(Charset.forName("GBK"));​

解决方案二:
手动进行编码转换(治标不治本):

​String strAttr = new String(attr.toString().getBytes("ISO-8859-1"), "GBK");​