[英]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.