Я предполагаю, что вы хотите взять 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