diff --git a/jansi/src/main/java/org/fusesource/jansi/AnsiConsole.java b/jansi/src/main/java/org/fusesource/jansi/AnsiConsole.java index 6ad0be6b..5ffc3336 100644 --- a/jansi/src/main/java/org/fusesource/jansi/AnsiConsole.java +++ b/jansi/src/main/java/org/fusesource/jansi/AnsiConsole.java @@ -15,6 +15,8 @@ */ package org.fusesource.jansi; +import org.fusesource.jansi.internal.Kernel32; + import static org.fusesource.jansi.internal.CLibrary.STDERR_FILENO; import static org.fusesource.jansi.internal.CLibrary.STDOUT_FILENO; import static org.fusesource.jansi.internal.CLibrary.isatty; @@ -23,6 +25,8 @@ import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; +import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; /** * Provides consistent access to an ANSI aware console PrintStream. @@ -33,10 +37,30 @@ public class AnsiConsole { public static final PrintStream system_out = System.out; - public static final PrintStream out = new PrintStream( wrapOutputStream( system_out ) ); + public static final PrintStream out; public static final PrintStream system_err = System.err; - public static final PrintStream err = new PrintStream( wrapErrorOutputStream( system_err ) ); + public static final PrintStream err; + + static { + String charset = Charset.defaultCharset().name(); + String os = System.getProperty("os.name"); + if (os.startsWith("Windows") && !isXterm()) { + int codepage = Kernel32.GetConsoleOutputCP(); + //http://docs.oracle.com/javase/6/docs/technotes/guides/intl/encoding.doc.html + if (Charset.isSupported("ms" + codepage)) { + charset = "ms" + codepage; + } else if (Charset.isSupported("cp" + codepage)) { + charset = "cp" + codepage; + } + } + try { + out = new PrintStream(wrapOutputStream(system_out), false, charset); + err = new PrintStream(wrapErrorOutputStream(system_err), false, charset); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } private static int installed; diff --git a/jansi/src/test/java/org/fusesource/jansi/AnsiConsoleExample3.java b/jansi/src/test/java/org/fusesource/jansi/AnsiConsoleExample3.java new file mode 100644 index 00000000..58ff88fc --- /dev/null +++ b/jansi/src/test/java/org/fusesource/jansi/AnsiConsoleExample3.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2009-2017 the original author(s). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.fusesource.jansi; + +import java.io.IOException; +import java.nio.charset.Charset; + +/** + * Quick test to show issues with non-ascii characters on Windows when using AnsiConsole. + * Not really battle-tested for any Windows encoding, but you can update + */ +public class AnsiConsoleExample3 { + + private final static String NON_ASCII = "éèä"; + private AnsiConsoleExample3() { + } + + public static void main(String[] args) throws IOException { + System.out.println("Platform: " + System.getProperty("os.name")); + System.out.println("Platform encoding: " + Charset.defaultCharset()); + System.out.println("System.out: " + NON_ASCII); + AnsiConsole.out.println("AnsiConsole.out: " + NON_ASCII); + } + +} \ No newline at end of file