java控制台charset翻译

Tes*_*son 5 java

控制台输入(win),charset convertion如何工作?

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

BufferedReader console = new BufferedReader( new InputStreamReader(System.in));
String inp = console.readLine();
System.out.println(inp.toUpperCase());
Run Code Online (Sandbox Code Playgroud)

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

axt*_*avt 13

实际上,Java根本不处理这个问题.

它只是假设控制台编码与系统默认编码相同.这种假设在Windows系统上是错误的,因此Java无法提供良好的解决方案来执行与Windows上的非ascii字符相关的正确控制台IO.

可能的解决方案是

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

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

    请注意,当您使用重定向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());
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 使用file.encodingproperty将控制台编码指定为默认编码,因此控制台IO使用默认编码的假设是正确的:

    java -Dfile.encoding=... ...
    
    Run Code Online (Sandbox Code Playgroud)


jay*_*100 5

1)实际说法:字符编码如何工作,以及如何处理它们:

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

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

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

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

在"System"的情况下,ClassLoading是一项复杂的任务,正如您所暗示的那样,因为设置System类(就像设置java Runtime类一样)是一个较低级别的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