读取unicode char代码JAVA

时间:2018-06-08 21:23:26

标签: java unicode

您好我正在阅读包含此行的file(请使用链接查看该文件):

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 :(得分:0)

将行数据类型更改为char,如果不起作用,则String.getBytes()

答案 1 :(得分:0)

我假设您想要获取文件每行上的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+后面的数字字符串并将其转换为实际数值。那就是你要打印的字符值。

以下是一个完整的程序 - 基本上和你的一样,但我把文件名作为参数而不是硬编码。我还添加了跳过空白行,并拒绝无效字符串 - 而是打印一个空格。

如果该行与Unicode表示的U+nnnn形式不匹配,则拒绝该行 - 与"(?i)U\\+[0-9A-F]{4}"匹配,这意味着:
(?i) - 忽略案件
U\\+ - 匹配U+,其中+必须转义为文字加上 [0-9A-F] - 匹配任何字符0-9或A-F(忽略大小写)
{4} - 恰好4次

如果您的更新包含已包含#条评论的链接示例文件,我已修改了我的原始程序(如下所示),现在它将删除评论,然后转换剩余的代码。

这是一个完整的程序,可以按以下方式运行:
javac Reader2.java
java Reader2 inputfile.txt

我使用您的文件子集对其进行了测试,在第1行以U+0000开头 inputfile.txt ,在第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 一行的原始程序就在这里。

你可以这样运行:
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✘ES