簡體   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