名称包含汉字的不寻常XML实体-如何解码?

时间:2018-12-16 18:19:32

标签: java xml cjk

我有一个XML,它在文件名包含汉字时使用不寻常的实体。我不知道如何解码这些文件名。有什么想法吗?

<string name="Name" value="&Aacute;&yacute;&frac34;&micro; &ordm;&pound;&Iacute;&otilde;&Ocirc;&curren;&cedil;&aelig;&AElig;&not;-01.wav"/>

结果名称应为慢镜海王预告片-01.wav

我该如何将其改回正确的名称?

1 个答案:

答案 0 :(得分:0)

看起来,以GB18030编码方式编码的文本已被解释为Latin-1,然后这些字符已被转义为HTML实体引用。

来自unescapeHtml4()StringEscapeUtils类的Apache Commons Text方法可用于取消转义实体引用,下面的小程序对此进行了演示。

笼镜 海王预告片-01.wav打印到标准输出。这与您要求的非常相似。只有第一个汉字是不同的。如果将输入字符串中的&Aacute;更改为&Acirc;,则程序将输出准确的所需文件名(慢镜 海王预告片-01.wav)。

import java.nio.charset.Charset;
import java.io.PrintStream;
import org.apache.commons.text.StringEscapeUtils;

public class Chinese {
    public static void main(String[] args) {
        String fname = "&Aacute;&yacute;&frac34;&micro; &ordm;&pound;&Iacute;&otilde;&Ocirc;&curren;&cedil;&aelig;&AElig;&not;-01.wav";
        decode(fname);
    }

    static void decode(String s) {
        Charset latin1 = Charset.forName("latin1");
        Charset gb18030 = Charset.forName("gb18030");
        Charset utf8 = Charset.forName("utf8");

        String unescaped = StringEscapeUtils.unescapeHtml4(s);
        byte[] latin1_bytes = unescaped.getBytes(latin1);
        String text = new String(latin1_bytes, gb18030);

        PrintStream ps = new PrintStream(System.out, true, utf8);
        ps.println(text);
    }
}