From: <otm...@us...> - 2010-09-29 06:30:05
|
Revision: 7128 http://jython.svn.sourceforge.net/jython/?rev=7128&view=rev Author: otmarhumbel Date: 2010-09-29 06:29:59 +0000 (Wed, 29 Sep 2010) Log Message: ----------- try to get the console encoding from java.io.Console using reflection fixes issue #1568 (given that Jython runs on Java 6) thanks to Regis Desgroppes for the hints Modified Paths: -------------- trunk/jython/NEWS trunk/jython/src/org/python/core/PySystemState.java Modified: trunk/jython/NEWS =================================================================== --- trunk/jython/NEWS 2010-09-28 05:35:21 UTC (rev 7127) +++ trunk/jython/NEWS 2010-09-29 06:29:59 UTC (rev 7128) @@ -2,6 +2,7 @@ Jython 2.5.2rc1 Bugs Fixed + - [ 1568 ] sys.stdout.encoding returns wrong value in Windows with Jython 2.5.1 (fixed on Java 6 only) - [ 1647 ] zxJDBC does not handle NVARCHAR Jython 2.5.2b2 Modified: trunk/jython/src/org/python/core/PySystemState.java =================================================================== --- trunk/jython/src/org/python/core/PySystemState.java 2010-09-28 05:35:21 UTC (rev 7127) +++ trunk/jython/src/org/python/core/PySystemState.java 2010-09-29 06:29:59 UTC (rev 7128) @@ -10,6 +10,7 @@ import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; +import java.lang.reflect.Method; import java.net.URL; import java.net.URLDecoder; import java.nio.charset.Charset; @@ -652,12 +653,7 @@ } } if (!registry.containsKey(PYTHON_CONSOLE_ENCODING)) { - String encoding; - try { - encoding = System.getProperty("file.encoding"); - } catch (SecurityException se) { - encoding = null; - } + String encoding = getPlatformEncoding(); if (encoding != null) { registry.put(PYTHON_CONSOLE_ENCODING, encoding); } @@ -665,7 +661,40 @@ // Set up options from registry Options.setFromRegistry(); } + + /** + * @return the encoding of the underlying platform; can be <code>null</code> + */ + private static String getPlatformEncoding() { + // first try to grab the Console encoding + String encoding = getConsoleEncoding(); + if (encoding == null) { + try { + encoding = System.getProperty("file.encoding"); + } catch (SecurityException se) { + // ignore, can't do anything about it + } + } + return encoding; + } + /** + * @return the console encoding; can be <code>null</code> + */ + private static String getConsoleEncoding() { + String encoding = null; + try { + // the Console class is only present in java 6 - have to use reflection + Class<?> consoleClass = Class.forName("java.io.Console"); + Method encodingMethod = consoleClass.getDeclaredMethod("encoding"); + encodingMethod.setAccessible(true); // private static method + encoding = (String)encodingMethod.invoke(consoleClass); + } catch (Exception e) { + // ignore any exception + } + return encoding; + } + private static void addRegistryFile(File file) { if (file.exists()) { if (!file.isDirectory()) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |