Index: Resources.java =================================================================== --- Resources.java (revision 449541) +++ Resources.java (working copy) @@ -18,6 +18,9 @@ import java.io.*; import java.net.URL; import java.net.URLConnection; +import java.nio.charset.Charset; +import java.nio.charset.IllegalCharsetNameException; +import java.nio.charset.UnsupportedCharsetException; import java.util.Properties; /** @@ -27,6 +30,8 @@ private static ClassLoader defaultClassLoader; + private static final String DEFAULT_ENCODING = "UTF-8"; + private Resources() { } @@ -147,7 +152,8 @@ * @throws IOException If the resource cannot be found or read */ public static Reader getResourceAsReader(String resource) throws IOException { - return new InputStreamReader(getResourceAsStream(resource)); + String encoding = computeEncoding(getClassLoader(), resource); + return new InputStreamReader(getResourceAsStream(resource), Charset.forName(encoding)); } /** @@ -159,7 +165,8 @@ * @throws IOException If the resource cannot be found or read */ public static Reader getResourceAsReader(ClassLoader loader, String resource) throws IOException { - return new InputStreamReader(getResourceAsStream(loader, resource)); + String encoding = computeEncoding(loader, resource); + return new InputStreamReader(getResourceAsStream(loader, resource), Charset.forName(encoding)); } /** @@ -281,4 +288,37 @@ } } + private static String computeEncoding(ClassLoader loader, String resource) throws IOException { + //default encoding for XML reading + String encoding = DEFAULT_ENCODING; + InputStreamReader inputStreamReader = null; + BufferedReader br = null; + try { + inputStreamReader = new InputStreamReader(loader.getResourceAsStream(resource)); + br = new BufferedReader(inputStreamReader); + String line = br.readLine(); + if (line == null) { + return encoding; + } + int start = 0; + if ((start = line.indexOf("encoding")) > 0) { + int startQuote = line.indexOf("\"", start + 1); + int endQuote = line.indexOf("\"", startQuote + 1); + encoding = line.substring(startQuote + 1, endQuote); + Charset.forName(encoding); + } + } catch (IllegalCharsetNameException e) { + encoding = DEFAULT_ENCODING; + } catch (UnsupportedCharsetException e) { + encoding = DEFAULT_ENCODING; + } finally { + if (inputStreamReader != null) { + inputStreamReader.close(); + } + if(br != null) { + br.close(); + } + } + return encoding; + } }