java控制台charset翻译

时间:2011-12-23 13:58:54

标签: java

控制台输入(win),charset转换是如何工作的?

下面的代码,非ascii字符输出垃圾 - 下面示例中的InputStreamReader不将charset作为参数。

BufferedReader console = new BufferedReader( new InputStreamReader(System.in));
String inp = console.readLine();
System.out.println(inp.toUpperCase());

与os无关,Java如何解决有关控制台提示输入的所有不同可能的charset配置?

2 个答案:

答案 0 :(得分:13)

实际上, Java根本不能解决这个问题

它只是假设控制台编码与系统默认编码相同。 This assumption is wrong on Windows systems因此,对于Windows上的非ascii字符,Java无法提供正确的控制台IO。

可能的解决方案是:

  • 使用Java 6中引入的System.console()

    BufferedReader in = new BufferedReader(System.console().reader());
    BufferedWriter out = new PrintWriter(System.console().writer(), true);
    
    out.println(in.readLine().toUpperCase());
    

    请注意,当您使用重定向IO运行程序时,System.console()可以返回null,例如,在IDE中。你需要一个这种情况的后备。

  • 明确指定控制台编码:

    String consoleEncoding = "...";
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in, consoleEncoding));
    BufferedWriter out = new PrintWriter(new OutputStreamWriter(System.in, consoleEncoding), true);
    
    out.println(in.readLine().toUpperCase());
    

    据我所知,没有很好的方法可以在没有本机代码的情况下以编程方式确定实际的控制台编码。

  • 使用file.encoding属性将控制台编码指定为默认编码,以便控制台IO使用默认编码的假设是正确的:

    java -Dfile.encoding=... ...
    

答案 1 :(得分:5)

1)实际上说:角色编码如何运作,以及如何处理它们:

读入的任何字符流都是编码/解码的。 Java将编码/解码细节捆绑为JDK的一部分:http://docs.oracle.com/javase/1.6/docs/guide/intl/encoding.doc.html。示例:UTF-8 issue in Java code

2)您的具体问题:跨平台JAVA语言如何处理特定于操作系统的控制台输入?

简短的回答:尽管Java字节码是平台中立的,但JVM却不是。也就是说,java“System”“in / out / err”流功能​​并没有在普通的旧java中完全实现!

当您运行java时,将加载“System”类,该类抽象运行JVM的系统的基本概念。在这个时候,它的输入/输出/错误流是(当你键入System.in时,你正在访问的对象,System.out,System.err是由ClassLoader在RUNTIME设置的,它负责,...加载java类。

在“系统”的情况下,ClassLoading是一项复杂的任务,因为你暗示,因为设置系统类(就像设置java 运行时类一样)是较低级别的JVM实现问题是特定于操作系统的。

同样,要明确一点:虽然Java LANGUAGE是独立于平台的,但是与Java编程语言不同,您的平台的JVM是一个特定于操作系统的环境,它创建我们在代码中引用的资源。我们在运行时。

更多理解:查看System类的实际源代码,它非常易读,可以让您更好地了解最新情况。特别是,请查看nullInputStream()方法:

http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Core/lang/java/lang/System.java.htm