Необычные сущности XML, когда имена содержат китайские символы - как декодировать? - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть XML, который использует необычные объекты, когда имена файлов содержат китайские символы.Я понятия не имею, как декодировать эти имена файлов.Любые идеи?

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

Полученное имя должно быть 慢 镜 海王 预告 01 -01.wav

Как я могу превратить их обратно в правильное имя?

1 Ответ

0 голосов
/ 31 декабря 2018

Похоже, что текст, закодированный в кодировке 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...