Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/ShpReader.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/ShpReader.java	(revision 30507)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/ShpReader.java	(revision 30508)
@@ -5,7 +5,14 @@
 
 import java.awt.Component;
+import java.io.BufferedReader;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.charset.Charset;
+import java.nio.charset.IllegalCharsetNameException;
+import java.nio.charset.StandardCharsets;
+import java.nio.charset.UnsupportedCharsetException;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -168,7 +175,24 @@
 			if (file != null) { 
 		        Map params = new HashMap();
+		        Charset charset = null;
 		        params.put(ShapefileDataStoreFactory.URLP.key, file.toURI().toURL());
 		        if (handler != null && handler.getDbfCharset() != null) {
-		        	params.put(ShapefileDataStoreFactory.DBFCHARSET.key, handler.getDbfCharset());
+		            charset = handler.getDbfCharset();
+		        } else {
+		            String path = file.getAbsolutePath();
+		            // See http://gis.stackexchange.com/a/3663/17245
+		            path = path.substring(0, path.lastIndexOf('.')) + ".cpg";
+                    Path cpg = new File(path).toPath();
+		            if (Files.exists(cpg)) {
+		                try (BufferedReader reader = Files.newBufferedReader(cpg, StandardCharsets.UTF_8)) {
+		                    charset = Charset.forName(reader.readLine());
+                        } catch (IOException | UnsupportedCharsetException | IllegalCharsetNameException e) {
+                            Main.warn(e);
+                        }
+		            }
+		        }
+		        if (charset != null) {
+		            Main.info("Using charset "+charset);
+		            params.put(ShapefileDataStoreFactory.DBFCHARSET.key, charset);
 		        }
 				DataStore dataStore = new ShapefileDataStoreFactory().createDataStore(params);//FIXME
@@ -202,5 +226,5 @@
 							}
 						} catch (UserCancelException e) {
-                                                        e.printStackTrace();
+                            e.printStackTrace();
 							return ds;
 						}
@@ -211,5 +235,5 @@
 					}
 				} catch (Throwable e) {
-                                        e.printStackTrace();
+                    e.printStackTrace();
 				} finally {
 					iterator.close();
@@ -221,8 +245,8 @@
 			}
 		} catch (IOException e) {
-                        e.printStackTrace();
+            e.printStackTrace();
 			throw e;
 		} catch (Throwable t) {
-                        t.printStackTrace();
+            t.printStackTrace();
 			throw new IOException(t);
 		}
