From 399cf87d36a390ef26c15b9bae1ec134fd688e90 Mon Sep 17 00:00:00 2001 From: sherman Date: Thu, 16 Feb 2012 22:13:10 -0800 Subject: [PATCH] 4153167: separate between ANSI and OEM code pages on Windows Summary: To use OEM code page for System.out&err when not redirected Reviewed-by: alanb --- src/share/classes/java/lang/System.java | 18 ++++++++++-- src/share/native/java/lang/System.c | 7 +++++ src/share/native/java/lang/java_props.h | 2 ++ src/windows/native/java/lang/java_props_md.c | 29 ++++++++++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) diff --git a/src/share/classes/java/lang/System.java b/src/share/classes/java/lang/System.java index e2b010e08..67ec909f6 100644 --- a/src/share/classes/java/lang/System.java +++ b/src/share/classes/java/lang/System.java @@ -1099,6 +1099,19 @@ public final class System { */ public static native String mapLibraryName(String libname); + /** + * Create PrintStream for stdout/err based on encoding. + */ + private static PrintStream newPrintStream(FileOutputStream fos, String enc) { + if (enc != null) { + try { + return new PrintStream(new BufferedOutputStream(fos, 128), true, enc); + } catch (UnsupportedEncodingException uee) {} + } + return new PrintStream(new BufferedOutputStream(fos, 128), true); + } + + /** * Initialize the system class. Called after thread initialization. */ @@ -1139,8 +1152,9 @@ public final class System { FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out); FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err); setIn0(new BufferedInputStream(fdIn)); - setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true)); - setErr0(new PrintStream(new BufferedOutputStream(fdErr, 128), true)); + setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding"))); + setErr0(newPrintStream(fdErr, props.getProperty("sun.stderr.encoding"))); + // Load the zip library now in order to keep java.util.zip.ZipFile // from trying to use itself to load this library later. loadLibrary("zip"); diff --git a/src/share/native/java/lang/System.c b/src/share/native/java/lang/System.c index 86ad8f6ce..6b06cbd6a 100644 --- a/src/share/native/java/lang/System.c +++ b/src/share/native/java/lang/System.c @@ -235,7 +235,14 @@ Java_java_lang_System_initProperties(JNIEnv *env, jclass cla, jobject props) } PUTPROP(props, "file.encoding", sprops->encoding); PUTPROP(props, "sun.jnu.encoding", sprops->sun_jnu_encoding); + if (sprops->sun_stdout_encoding != NULL) { + PUTPROP(props, "sun.stdout.encoding", sprops->sun_stdout_encoding); + } + if (sprops->sun_stderr_encoding != NULL) { + PUTPROP(props, "sun.stderr.encoding", sprops->sun_stderr_encoding); + } PUTPROP(props, "file.encoding.pkg", "sun.io"); + /* unicode_encoding specifies the default endianness */ PUTPROP(props, "sun.io.unicode.encoding", sprops->unicode_encoding); PUTPROP(props, "sun.cpu.isalist", diff --git a/src/share/native/java/lang/java_props.h b/src/share/native/java/lang/java_props.h index 89f7671c7..18a1b3451 100644 --- a/src/share/native/java/lang/java_props.h +++ b/src/share/native/java/lang/java_props.h @@ -66,6 +66,8 @@ typedef struct { char *display_variant; char *encoding; char *sun_jnu_encoding; + char *sun_stdout_encoding; + char *sun_stderr_encoding; char *timezone; char *printerJob; diff --git a/src/windows/native/java/lang/java_props_md.c b/src/windows/native/java/lang/java_props_md.c index e27d1ea0b..bfa3711b9 100644 --- a/src/windows/native/java/lang/java_props_md.c +++ b/src/windows/native/java/lang/java_props_md.c @@ -31,6 +31,9 @@ #include #include +#include +#include + #include "locale_str.h" #include "java_props.h" @@ -123,6 +126,17 @@ getEncodingInternal(LCID lcid) return ret; } +static char* getConsoleEncoding() +{ + char* buf = malloc(16); + int cp = GetConsoleCP(); + if (cp >= 874 && cp <= 950) + sprintf(buf, "ms%d", cp); + else + sprintf(buf, "cp%d", cp); + return buf; +} + // Exported entries for AWT DllExport const char * getEncodingFromLangID(LANGID langID) @@ -562,6 +576,7 @@ GetJavaProperties(JNIEnv* env) { char * display_encoding; + HANDLE hStdOutErr; // Windows UI Language selection list only cares "language" // information of the UI Language. For example, the list @@ -606,6 +621,20 @@ GetJavaProperties(JNIEnv* env) sprops.encoding = "MS950_HKSCS"; sprops.sun_jnu_encoding = "MS950_HKSCS"; } + + hStdOutErr = GetStdHandle(STD_OUTPUT_HANDLE); + if (hStdOutErr != INVALID_HANDLE_VALUE && + GetFileType(hStdOutErr) == FILE_TYPE_CHAR) { + sprops.sun_stdout_encoding = getConsoleEncoding(); + } + hStdOutErr = GetStdHandle(STD_ERROR_HANDLE); + if (hStdOutErr != INVALID_HANDLE_VALUE && + GetFileType(hStdOutErr) == FILE_TYPE_CHAR) { + if (sprops.sun_stdout_encoding != NULL) + sprops.sun_stderr_encoding = sprops.sun_stdout_encoding; + else + sprops.sun_stderr_encoding = getConsoleEncoding(); + } } } -- GitLab