Ignore:
Timestamp:
2014-07-01T21:07:01+02:00 (10 years ago)
Author:
donvip
Message:

[josm_opendata] fix #josm10214 - read encoding of shapefiles from .cpg files

File:
1 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/ShpReader.java

    r30340 r30508  
    55
    66import java.awt.Component;
     7import java.io.BufferedReader;
    78import java.io.File;
    89import java.io.IOException;
    910import java.io.InputStream;
     11import java.nio.charset.Charset;
     12import java.nio.charset.IllegalCharsetNameException;
     13import java.nio.charset.StandardCharsets;
     14import java.nio.charset.UnsupportedCharsetException;
     15import java.nio.file.Files;
     16import java.nio.file.Path;
    1017import java.util.HashMap;
    1118import java.util.HashSet;
     
    168175                        if (file != null) {
    169176                        Map params = new HashMap();
     177                        Charset charset = null;
    170178                        params.put(ShapefileDataStoreFactory.URLP.key, file.toURI().toURL());
    171179                        if (handler != null && handler.getDbfCharset() != null) {
    172                                 params.put(ShapefileDataStoreFactory.DBFCHARSET.key, handler.getDbfCharset());
     180                            charset = handler.getDbfCharset();
     181                        } else {
     182                            String path = file.getAbsolutePath();
     183                            // See http://gis.stackexchange.com/a/3663/17245
     184                            path = path.substring(0, path.lastIndexOf('.')) + ".cpg";
     185                    Path cpg = new File(path).toPath();
     186                            if (Files.exists(cpg)) {
     187                                try (BufferedReader reader = Files.newBufferedReader(cpg, StandardCharsets.UTF_8)) {
     188                                    charset = Charset.forName(reader.readLine());
     189                        } catch (IOException | UnsupportedCharsetException | IllegalCharsetNameException e) {
     190                            Main.warn(e);
     191                        }
     192                            }
     193                        }
     194                        if (charset != null) {
     195                            Main.info("Using charset "+charset);
     196                            params.put(ShapefileDataStoreFactory.DBFCHARSET.key, charset);
    173197                        }
    174198                                DataStore dataStore = new ShapefileDataStoreFactory().createDataStore(params);//FIXME
     
    202226                                                        }
    203227                                                } catch (UserCancelException e) {
    204                                                         e.printStackTrace();
     228                            e.printStackTrace();
    205229                                                        return ds;
    206230                                                }
     
    211235                                        }
    212236                                } catch (Throwable e) {
    213                                         e.printStackTrace();
     237                    e.printStackTrace();
    214238                                } finally {
    215239                                        iterator.close();
     
    221245                        }
    222246                } catch (IOException e) {
    223                         e.printStackTrace();
     247            e.printStackTrace();
    224248                        throw e;
    225249                } catch (Throwable t) {
    226                         t.printStackTrace();
     250            t.printStackTrace();
    227251                        throw new IOException(t);
    228252                }
Note: See TracChangeset for help on using the changeset viewer.