[英]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
因为它提供了方便的阅读文本的方法。
包裹InputStream
在InputStreamReader
。
int read = new InputStreamReader(System.in).read();
System.out.println((char) read); // prints 'ğ'
如有必要,您可以将特定的Charset
传递给阅读器的构造函数,但默认情况下,它只使用默认的字符集,这可能是正确的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.