源代码中的字符串和从文件中读取的字符串之间有什么区别?

2022-09-02 23:49:22

我的磁盘中有一个名为“dd.txt”的文件,它的内容是\u5730\u7406

现在,当我运行这个程序

public static void main(String[] args) throws IOException {
    FileInputStream fis=new FileInputStream("d:\\dd.txt");
    ByteArrayOutputStream baos=new ByteArrayOutputStream();
    byte[] buffer=new byte[fis.available()];
    while ((fis.read(buffer))!=-1) {
        baos.write(buffer);
    }
    String s1="\u5730\u7406";
    String s2=baos.toString("utf-8");
    System.out.println("s1:"+s1+"\n"+"s2:"+s2);
}

我得到了不同的结果

s1:地理
s2:\u5730\u7406

你能告诉我为什么吗?以及我如何读取该文件并获得与中文s1相同的结果?


答案 1

当您用Java代码编写时,编译器会将其解释为单个unicode字符(unicode文本)。当您将相同的内容写入文件时,它只有6个常规字符(因为没有任何解释它)。您没有直接写入文件的原因是什么?\u5730地理

如果您希望读取包含 unicode 文本的文件,则需要自己解析值,丢弃并自行解析 unicode 代码点。如果您控制文件的创建,那么首先在文件中使用合适的编码(例如UTF-8)编写适当的unicode要容易得多,并且在正常情况下,您不应该遇到包含这些转义unicode文字的文件。\u


答案 2

在 Java 代码中,它们被解释为 Unicode 文本,因此它们显示为中文字符。这样做只是因为编译器被指示这样做。\uxxxx

要获得相同的结果,您必须自己进行一些解析:

String[] hexCodes = s2.split("\\\\u");
for (String hexCode : hexCodes) {
    if (hexCode.length() == 0)
        continue;
    int intValue = Integer.parseInt(hexCode, 16);
    System.out.print((char)intValue);
}

(请注意,这仅适用于每个字符都采用 Unicode 文字形式的情况,例如\uxxxx)