簡體   English   中英

Java Scanner 將 UTF-8 lambda 字符讀取為 0

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM