Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何检测(并更改?)System.console的编码?_Java_Macos_Encoding_Console_Character Encoding - Fatal编程技术网

Java:如何检测(并更改?)System.console的编码?

Java:如何检测(并更改?)System.console的编码?,java,macos,encoding,console,character-encoding,Java,Macos,Encoding,Console,Character Encoding,我有一个在控制台上运行的程序,它的UMLAUT和其他特殊字符被输出为Mac上的。下面是一个简单的测试程序: public static void main( String[] args ) { System.out.println("höhößüä"); System.console().printf( "höhößüä" ); } 在默认的Mac控制台(使用默认的UTF-8编码)上,打印: h?h???? h?h???? 但在手动将Mac终端的编码设置为“Mac OS

我有一个在控制台上运行的程序,它的UMLAUT和其他特殊字符被输出为Mac上的。下面是一个简单的测试程序:

public static void main( String[] args ) {
    System.out.println("höhößüä");
    System.console().printf( "höhößüä" );
}
在默认的Mac控制台(使用默认的UTF-8编码)上,打印:

 h?h????
 h?h????
但在手动将Mac终端的编码设置为“Mac OS Roman”后,它会正确打印

 höhößüä
 höhößüä
请注意,在使用System.console()的Windows系统上:

那么我该如何让我的程序…rolleyes…“到处运行”?

Epaga:看看吧。您可以在printstream中设置输出编码-只需确定或绝对确定要设置的是哪个

import java.io.PrintStream;
import java.io.UnsupportedEncodingException;

public class Test {
    public static void main (String[] argv) throws UnsupportedEncodingException {
    String unicodeMessage =
    "\u7686\u3055\u3093\u3001\u3053\u3093\u306b\u3061\u306f";

    PrintStream out = new PrintStream(System.out, true, "UTF-8");
    out.println(unicodeMessage);
  }
}
要确定控制台编码,您可以使用系统命令“locale”并解析输出,在德国UTF-8系统上,输出如下所示:

LANG="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_CTYPE="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_ALL=

启动应用程序时,请尝试以下命令行参数:

-Dfile.encoding=utf-8

这将更改JVM用于I/O操作的默认编码

您也可以尝试:

System.setOut(new PrintStream(System.out, true, "utf-8"));

问题是我把这个控制台程序作为一个jar发布,因此,我正在寻找一种不需要用户添加自己的命令行参数的解决方案。@Epaga-使用bat文件或jar的包装器?-Dfile.encoding=utf-8不是一个标准选项,应该避免使用。@Bozho第二个选项有助于将utf-8(希伯来语)打印到我的控制台。然而,我的最终问题是servlet url模式的映射。在url模式中使用希伯来语url时,映射显示为胡言乱语(我在jconsole MBeans上进行了检查)。我认为修复控制台打印也会修复映射,但事实并非如此。您还有其他建议吗?2个问题:1)如何知道控制台中设置了哪种编码?2) 有没有办法继续使用System.console()?没有,您不能使用
System.console()
保留您的代码,我认为这并不重要
PrintStream
也有您想要的一切,而且它工作正常+1)您可以使用系统命令“locale”并解析其输出。
System.setOut(new PrintStream(System.out, true, "utf-8"));