Scanner vs System.console()。write()

时间:2014-05-28 06:38:19

标签: java string

我尝试在屏幕上打印出包含西班牙语重音的字符串。 我用相同的输入得到不同的答案,但采用不同的方法。

我的第一种方法是通过扫描仪类

读取包含西班牙语重音的字符串
 //input is a á e é i í o ó u ú A Á E É I Í O Ó U Ú Ñ ñ

    Scanner sc = new Scanner(System.in);
    System.out.println("Enter some spanish chars next: ");
    String spanishLine = sc.nextLine();

    try {
        System.out.println("Output from Scanner: " + spanishLine);
        System.console().writer().println(spanishLine);
    } catch (Exception e) {

    }

我的第二个apporche是我从这个网站找到的:http://www.rgagnon.com/javadetails/java-0046.html

        String s = "a á e é i í o ó u ú A Á E É I Í O Ó U Ú Ñ ñ";

        try {
            System.out.println("Output from System.console: " + s);
            System.console().writer().println(s);
        } catch (Exception e) {

        }

我的出现如下

Enter some spanish chars next: 
a á e é i í o ó u ú A Á E É I Í O Ó U Ú Ñ ñ
output from Scanner: a � e � i � o � u � A � E � I � O � U � � �
output from System.console: a á e é i í o ó u ú A Á E É I Í O Ó U Ú Ñ ñ

任何人都可以解释为什么我从同一输入中得到两个不同的答案。 如何修复我的第一种方法以获得与第二种方法相同的结果?

2 个答案:

答案 0 :(得分:3)

使用第二种方法,String的字节直接输入到app中。使用第一种方法,您依赖于扫描仪的区域设置

http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#useLocale(java.util.Locale)

答案 1 :(得分:1)

不是答案

你还需要检查一些事情。

  1. java编译器使用的java源代码编码必须与文本/编辑器的编码相同。

    • 您可以使用程序员的编辑器(如JEdit或NotePad ++)进行检查。
  2. 检查默认编码:

    • System.out.println(System.getProperty("file.encoding"));
    • 或者向扫描程序构造函数添加额外的编码参数
    • 原因是,通常存在没有编码的方法/构造函数版本,其中采用默认平台编码。
  3. 将System.out / console重定向到文件。

    • 在这种情况下,将字符串写入UTF-8就足够了。
  4. 尝试真正的控制台,而不是IDE。

    • IDE" console"的编码可配置。
  5. 我觉得行为令人费解。看起来Scanner采用编码UTF-8的字符集然后必须将其写入US-ASCII,因此给出了可映射的字符。那不可能。它看起来像扫描仪将是"越野车" - 我怀疑。

    尝试转储字符串:

    for (int i = 0; i < s.length(); ) {
        int cp = s.codePointAt(i);
        System.out.printf(" %x", cp);
        i += Character.charCount(cp);
    }
    System.out.println();
    

    (通常没有完成)

    System.setProperty("file.encoding","Windows-1252");