Как я могу конвертировать специальные символы, используя Java? - PullRequest
7 голосов
/ 18 февраля 2010

У меня есть строки вроде:

Avery® Laser & Inkjet Self-Adhesive

Мне нужно преобразовать их в

Avery Laser & Inkjet Self-Adhesive.

Т.е. удалить специальные символы и преобразовать специальные символы html в обычные.

Ответы [ 4 ]

19 голосов
/ 18 февраля 2010
Avery® Laser & Inkjet Self-Adhesive

Сначала используйте StringEscapeUtils#unescapeHtml4() (или #unescapeXml(), в зависимости от исходного формата), чтобы развернуть & в &. Затем используйте String#replaceAll() с [^\x20-\x7e], чтобы избавиться от символов, которые не входят в диапазон для печати ASCII .

Обобщенная:

String clean = StringEscapeUtils.unescapeHtml4(dirty).replaceAll("[^\\x20-\\x7e]", "");

.. который производит

Avery Laser & Inkjet Self-Adhesive

(без конечной точки, как в вашем примере, но ее нет в оригинале;))

Тем не менее, это похоже на запрос обходного пути , а не на запрос решения . Если вы подробнее расскажете о функциональных требованиях и / или происхождении этой строки, мы сможем предоставить правильное решение . ® выглядит так, как будто он вызван использованием неверной кодировки для чтения строки, а & выглядит так, как будто он вызван использованием синтаксического анализатора на основе текста для чтения строки вместо полноценного анализатора HTML.

6 голосов
/ 18 февраля 2010

Вы можете использовать StringEscapeUtils класс из Apache Commons Text проект.

1 голос
/ 18 апреля 2012

Если вы хотите имитировать, что функция php htmlspecialchars_decode использует функцию php get_html_translation_table (), чтобы вывести таблицу и затем использовать код java, например,

    static Hashtable html_specialchars_table = new Hashtable();
    static {
            html_specialchars_table.put("&lt;","<");
            html_specialchars_table.put("&gt;",">");
            html_specialchars_table.put("&amp;","&");
    }
    static String htmlspecialchars_decode_ENT_NOQUOTES(String s){
            Enumeration en = html_specialchars_table.keys();
            while(en.hasMoreElements()){
                    String key = (String)en.nextElement();
                    String val = (String)html_specialchars_table.get(key);
                    s = s.replaceAll(key, val);
            }
            return s;
    }
1 голос
/ 18 февраля 2010

Может быть, вы можете использовать что-то вроде:

yourTxt = yourTxt.replaceAll("&amp;", "&");

В каком-то проекте я сделал что-то вроде:

public String replaceAcutesHTML(String str) {

str = str.replaceAll("&aacute;","á");
str = str.replaceAll("&eacute;","é");
str = str.replaceAll("&iacute;","í");
str = str.replaceAll("&oacute;","ó");
str = str.replaceAll("&uacute;","ú");
str = str.replaceAll("&Aacute;","Á");
str = str.replaceAll("&Eacute;","É");
str = str.replaceAll("&Iacute;","Í");
str = str.replaceAll("&Oacute;","Ó");
str = str.replaceAll("&Uacute;","Ú");
str = str.replaceAll("&ntilde;","ñ");
str = str.replaceAll("&Ntilde;","Ñ");

return str;

}

...