Java Сканер, считывающий лямбда-символ UTF-8 как 0 - PullRequest
1 голос
/ 27 февраля 2020

Я пытаюсь ввести лямбда-функции из считывателя Java, но лямбда-символ читается как байт 0 и печатает как пустую строку. Я попытался изменить сканер на UTF-8 и изменил кодировку терминала, но ничего не изменилось. Я использую VS Code.

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")"
            */
    }
}

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Это происходит потому, что ваш входной терминал не поддерживает UTF-8 или входной формат не является UTF-8, поэтому лямбда отображается на 0. Используйте терминал, который поддерживает UTF-8.

Даже так имейте в виду, что некоторые символы UTF-8, такие как λ, будут занимать два байта, поэтому ваш код для l oop будет разбит с этой точки (он будет печатать второй байт лямбды рядом с "a", байтом «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 ")"
0 голосов
/ 27 февраля 2020

Вы можете распечатать 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...