Чтение кодов символов Юникода JAVA - PullRequest
0 голосов
/ 09 июня 2018

Привет, я читаю файл (пожалуйста, используйте ссылку, чтобы просмотреть файл), который содержит следующие строки:

U+0000
U+0001
U+0002
U+0003
U+0004
U+0005

с использованием этого кода

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

 public class fgenerator {    
public static void main(String[] args) {
    try(BufferedReader br  = new BufferedReader(new FileReader(new File("C:\\UNCDUNCD.txt")))){
        String line;
        String[] splited;
        while ((line = br.readLine()) != null){
            splited = line.split(" ");
            System.out.println(splited[0]);
        }
    }catch(Exception e) {
        e.printStackTrace();
    }

}

}

но вывод

U+D01C
U+D01D
U+D01E
U+D01F
U+D020
U+D021
  1. почему это происходит?

  2. как получить символего код

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Я предполагаю, что вы хотите взять Unicode представление , которое находится в каждой строке файла, и вывести фактический Unicode символ , который представляет код.

Если мы начнем с вашего цикла, который читает каждую строку из файла ...

while ((line = br.readLine()) != null){             
    System.out.println( line );
}

... то, что мы хотим сделать, это преобразовать входные данные line ви напечатайте , что ...

while ((line = br.readLine()) != null){             
    System.out.println( convert(line) ); <- I just put a method call to "convert()"
}

Итак, как вы convert(line) вводите символ перед его печатью?
Как и предлагалось в моем предыдущем комментарии, вы хотитевозьмите числовую строку, которая следует за U+, и преобразуйте ее в фактическое числовое значение.Таким образом, это значение символа, которое вы хотите напечатать.

Ниже приведена законченная программа - по сути, такая же, как ваша, но я принимаю имя файла в качестве аргумента, а не жестко его кодирую.Я также добавил пропуск пустых строк и отклонение недопустимых строк - вместо этого выведите пустое пространство.

Отклоните строку, если она не соответствует форме U+nnnn представления Unicode - сопоставьте с "(?i)U\\+[0-9A-F]{4}", что означает:
(?i) - игнорировать регистр
U\\+ - соответствовать U+, где + должен быть экранирован, чтобы быть буквальным плюсом *
[0-9A-F] - соответствовать любому символу 0-9 или AF (без учета регистра)
{4} - ровно 4 раза


В вашем обновлении, содержащем связанный файл примера, включающий # комментариев, я изменил свою исходную программу(ниже), поэтому теперь он будет обрезать комментарии и затем преобразовать оставшееся представление.

Это полная программа, которую можно запустить как:
javac Reader2.java
java Reader2 inputfile.txt

Я протестировал его с подмножеством вашего файла, начиная с inputfile.txt в строке 1 с U+0000 и заканчивая строкой 312 с U+0138

import java.io.*;

public class Reader2
{
    public static void main(String... args)
    {
        final String filename = args[0];
        try (BufferedReader br = new BufferedReader(
                                    new FileReader(new File( filename ))
                                 )
            )
        {
            String line;
            while ((line = br.readLine()) != null) {
                if (line.trim().length() > 0) { // skip blank lines
                  //System.out.println( convert(line) );
                  final Character c = convert(line);
                  if (Character.isValidCodePoint(c)) {
                        System.out.print  ( c );
                  }
                }
            }
            System.out.println();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }

    private static char convert(final String input)
    {
        //System.out.println("Working on line: " + input);
        if (! input.matches("(?i)U\\+[0-9A-F]{4}(\\s+#.*)")) {
            System.err.println("Rejecting line: " + input);
            return ' ';
        }
        else {
            //System.out.println("Accepting line: " + input);
        }
        // else
        final String stripped = input.replaceFirst("\\s+#.*$", "");
        final Integer cval = Integer.parseInt(stripped.substring(2), 16);
        //System.out.println("cval = " + cval);
        return (char) cval.intValue();
    }
}

Исходная программа, которая предполагала, что строка состояла из только из U+nnnn is здесь.

Вы бы запустили это как:
javac Reader.java
java Reader input.txt

import java.io.*;

public class Reader
{
    public static void main(String... args)
    {
        final String filename = args[0];
        try (BufferedReader br = new BufferedReader(
                                    new FileReader(new File( filename ))
                                 )
            )
        {
            String line;
            while ((line = br.readLine()) != null) {
                if (line.trim().length() > 0) { // skip blank lines
                  //System.out.println( line );
                    // Write all chars on one line rather than one char per line
                    System.out.print  ( convert(line) );
                }
            }
            System.out.println(); // Print a newline after all chars are printed
        }
        catch(Exception e) {      // don't catch plain `Exception` IRL
            e.printStackTrace();  // don't just print a stack trace IRL
        }
    }

    private static char convert(final String input)
    {
        // Reject any line that doesn't match U+nnnn
        if (! input.matches("(?i)U\\+[0-9A-F]{4}")) {
            System.err.println("Rejecting line: " + input);
            return ' ';
        }
        // else convert the line to the character
        final Integer cval = Integer.parseInt(input.substring(2), 16);
        //System.out.println("cval = " + cval);
        return (char) cval.intValue();
    }
}

Попробуйте использовать это в качестве входного файла:

U+0041
bad line
U+2718
U+00E9
u+0073

Перенаправить стандартную ошибку при ее запуске java Reader input.txt 2> /dev/null или закомментировать строку System.err.println...
Вы должны получить этот вывод: A *és

0 голосов
/ 09 июня 2018

изменить тип данных строки на char, если не работает, то String.getBytes()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...