繁体   English   中英

如何让System.in输入流读取utf-8字符?

[英]How can I make System.in Input Stream read utf-8 characters?

这是我的代码:

public class MyTestClass {
    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        InputStream inputStream = System.in;
        int read = inputStream.read();
        System.out.println(read);
        System.out.println((char)read);
        System.out.println(s);
    }
}

当我运行程序时,我输入了两次字母ğ 控制台输出将是:

ğ
ğ
196
Ä
ğ

我怎样才能看到正确的字母而不是Ä 扫描仪似乎做对了。

实际上,为什么这种方法不起作用? 这里有什么问题?

InputStream#read()的javadoc状态

从输入流中读取下一个数据字节。

但事实证明,角色ğ需要2个字节来表示UTF-8。 因此,您需要读取两个字节。 您可以使用InputStream#read(byte[])

byte[] buffer = new byte[2];
inputStream.read(buffer);

一旦字节数组包含适当的字节,您需要以UTF-8解码它们。 你可以这样做

char val = StandardCharsets.UTF_8.decode(ByteBuffer.wrap(buffer)).get();

变量val现在将包含已解码的字符。

请注意,某些UTF-8编码字符只需要一个字节来表示,因此如果您知道需要多少字节,那么您应该只执行我们刚才所做的操作。 否则,读取所有内容并将其传递给解码器。

InputStream.read()重新生成下一个数据byte ,这是一个0到255之间的数字。

在这里,您只是将该byte转换为char ,在您的情况下给出Ä

另一方面, Scanner读取整个字符串,这就是为什么你看到正确的输出。 我建议你使用Scanner而不是简单的InputStream因为它提供了方便的阅读文本的方法。

包裹InputStreamInputStreamReader

int read = new InputStreamReader(System.in).read();
System.out.println((char) read); // prints 'ğ'

如有必要,您可以将特定的Charset传递给阅读器的构造函数,但默认情况下,它只使用默认的字符集,这可能是正确的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM