【问题标题】:Java charset - How to get correct input from System.in?Java charset - 如何从 System.in 获得正确的输入?
【发布时间】:2016-04-09 23:45:28
【问题描述】:

我在这里的第一篇文章。 好吧,我正在构建一个简单的应用程序,用于通过控制台(cmd 和终端)进行消息传递,只是为了学习,但是在阅读和使用字符集编写文本时遇到了问题。

这是我发送消息的初始代码,Main.CHARSET 设置为 UTF-8:

Scanner teclado = new Scanner(System.in,Main.CHARSET);
BufferedWriter saida = new BufferedWriter(new OutputStreamWriter(new BufferedOutputStream(cliente.getOutputStream()),Main.CHARSET)));
saida.write(nick + " conectado!");
saida.flush();
while (teclado.hasNextLine()) {
    saida.write(nick +": "+ s);
    saida.flush();
}

以及接收代码:

try (BufferedReader br = new BufferedReader(new InputStreamReader(servidor,Main.CHARSET))){
    String s;
    while ((s = br.readLine()) != null) {
        System.out.println(s);
    }
}

当我发送“olá”或类似“ÁàçÇõÉ”(巴西葡萄牙语)之类的内容时,我在 windows cmd 上只有空格(未在 linux 中测试)。

所以我测试了以下代码:

Scanner s = new Scanner(System.in,Main.CHARSET);
System.out.println(s.nextLine());

对于输入“olá”,打印“ol”。

问题是,如何读取控制台以使输入被正确读取,并可以传输给另一个用户并正确显示给他。

【问题讨论】:

  • 您确定 Windows 控制台实际上可以显示 UTF-8(或默认为 UTF-8)。您只需将输出写入文件而不是屏幕,然后使用支持 UTF8 的编辑器查看文件即可进行检查。
  • 我把输出放到一个 txt 文件中,OutputStreamWriter 带有 UTF-8 字符集,输出是:ol。

标签: java sockets character-encoding message system.in


【解决方案1】:

如果你只是想在文本文件中输出葡萄牙语,那很容易。

您唯一需要关心的是通过 UTF-8 编码显示。

你可以使用一个非常简单的方法,比如

    String text = "olá";
    FileWriter fw = new FileWriter("hello.txt");
    fw.write(text);
    fw.close();

然后用记事本或任何支持UTF-8的文本工具打开hello.txt

或者您必须将工具的默认字体更改为 UTF-8。


如果你想在控制台上显示它,我想 pvg 已经回答你了。


好吧,看来你还是一头雾水。

这是一个您可以尝试的简单代码。

        Scanner userInput = new Scanner(System.in);//type olá plz
        String text = userInput.next();
        System.out.println((int)text.charAt(2));//you will see output int is 63        

        char word = 'á'; // this word covert to int is 225
        int a = 225;
        System.out.println((int)word);// output 225
        System.out.println((char)a);  // output  á

那么,结论是什么?

如果您使用控制台输入葡萄牙语然后抓住它,您会得到完全不同的单词,而不是乱码。

【讨论】:

  • 适用于硬编码字符串,但如果我从 System.in 读取文本,则不起作用。输出只是“ol?”或类似“ol”的东西
  • 好的,再次检查答案,确保你明白为什么总是出错。
  • 顺便说一下,ascii 数字 63 是问号,所以应该是 '?'。
  • 好的,我明白了。我在这里遇到了同样的错误,但是我在 Windows 7 控制台上得到了 160 而不是在 netbeans 控制台上得到了 65533 而不是 63,这一定是因为这两种编码。那么有没有办法正确阅读?从标准输入读取为 utf -8 ?或者控制台编码是另一个( cp850 windows 7 )的事实是不可能的?
  • @ehbarbian 好的,有几个主题可以帮助你。对于 netbeans 控制台:stackoverflow.com/questions/23709515/…stackoverflow.com/questions/23726899/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 2011-07-26
相关资源
最近更新 更多