[英]Java Scanner reading UTF-8 lambda character as 0
我試圖從 Java 讀取器輸入 lambda 函數,但 lambda 字符讀取為字節 0,並打印為空字符串。 我曾嘗試將掃描儀專門更改為 UTF-8 並更改了終端編碼,但沒有任何改變。 我正在使用 VS 代碼。
import java.util.*;
public class App {
public static void main (String[] args) throws Exception {
Scanner in = new Scanner(System.in, "UTF-8");
System.out.print("> ");
//input (λa.a)
String cmd = in.nextLine();
byte[] cmdBytes = cmd.getBytes("UTF-8");
for (int i = 0; i < cmdBytes.length; i++) {
System.out.println((int)cmdBytes[i] + "\"" + cmd.charAt(i) + "\"");
}
/*outputs
40"("
0" "
97"a"
46"."
97"a"
41")"
*/
}
}
您可以將 Lambda 打印到控制台,但您需要對 Java 代碼進行一些更改。
這是我的Java代碼:
import java.util.Scanner;
public class ScannerLambda {
public static void main(String[] args) throws Exception {
Scanner in = new Scanner(System.in, "UTF-8");
System.out.print("> ");
//input (λa.a)
String cmd = in.nextLine();
System.out.println(cmd);
// Use chars and not bytes, because lambda has 2 bytes in UTF-8
char[] cmdchars = cmd.toCharArray();
for (int i = 0; i < cmdchars.length; i++) {
System.out.println((int) cmdchars[i] + "\"" + cmd.charAt(i) + "\"");
}
}
}
然后你需要用這個 JVM 選項啟動程序:
-Dfile.encoding=UTF-8
這可確保控制台能夠正確打印 UTF-8 字符。 如果您使用的是 Windows,則這一點尤其重要,因為默認字符集不是 UTF-8。
這是我使用此處提供的解決方案獲得的輸出:
> λa.a
λa.a
955"λ"
97"a"
46"."
97"a"
發生這種情況是因為您的輸入終端不支持 UTF-8 或輸入格式不是 UTF-8,因此 lambda 被映射到 0。使用支持 UTF-8 的終端。
即便如此,請記住,某些 UTF-8 字符(如λ
將占用兩個字節,因此您的 for 循環將從該點開始中斷(它將在“a”附近打印 lambda 的第二個字節,即“ “.”附近的“a”,依此類推,最后會出現異常,因為您將嘗試訪問 .charAt(6),因為 cmdBytes 的長度為 7):
> (λa.a)
0: 40 "("
1: -50 "λ"
2: -69 "a"
3: 97 "."
4: 46 "a"
5: 97 ")"
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 6
at java.lang.String.charAt(String.java:658)
at App.main(App.java:14)
改變byte[] cmdBytes = cmd.getBytes("UTF-8");
對於char[] cmdBytes = cmd.toCharArray();
應該做的工作。 請記住,字符 'λ' 仍將占用兩個字節。
> (λa.a)
0: 40 "("
1: 955 "λ"
2: 97 "a"
3: 46 "."
4: 97 "a"
5: 41 ")"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.