您好我正在阅读包含此行的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
为什么会这样?
如何获取其代码的字符
答案 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