我有一个XML,它在文件名包含汉字时使用不寻常的实体。我不知道如何解码这些文件名。有什么想法吗?
<string name="Name" value="Áý¾µ º£ÍõÔ¤¸æƬ-01.wav"/>
结果名称应为慢镜海王预告片-01.wav
我该如何将其改回正确的名称?
答案 0 :(得分:0)
看起来,以GB18030编码方式编码的文本已被解释为Latin-1,然后这些字符已被转义为HTML实体引用。
来自unescapeHtml4()
的StringEscapeUtils
类的Apache Commons Text方法可用于取消转义实体引用,下面的小程序对此进行了演示。
笼镜 海王预告片-01.wav
打印到标准输出。这与您要求的非常相似。只有第一个汉字是不同的。如果将输入字符串中的Á
更改为Â
,则程序将输出准确的所需文件名(慢镜 海王预告片-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 = "Áý¾µ º£ÍõÔ¤¸æƬ-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);
}
}