Pracuję nad usunięciem lub zastąpieniem różnych symboli w ciągu (w Javie), który jest używany w polu obszaru tekstowego w aplikacji internetowej. Kiedy używam poniższej treści, zawartość jest konwertowana na wartości dziesiętne w formacie Unicode .

Treść jest następująca: String a = 'Last Search Results Bulletin Board Validations ⛔ 0 ⚡ 1 ⚠ 6? 0 '

Kiedy zapisuję tę treść w obszarze tekstowym (czyli na stronie internetowej), symbole te są zapisywane jako „,”, „9889 ;,”.

Chcę usunąć wartości reprezentacji Unicode (lub) zapisać zawartość w odpowiednim formacie, aby mieć odpowiednie dane do zapisania w bazie danych.

Jak usunąć wartości reprezentacji Unicode dla symboli („⛔” lub „⚡” lub „⚠”) z ciągu znaków? Właściwie starałem się, aby wyrażenie regularne zastępowało te reprezentacje, jak poniżej s.replaceAll ("& # [9728 - 9983];", ""). Zakres [9728 - 9983] reprezentuje różne wartości dziesiętne symboli Unicode, ale nie zastępuje go prawidłowo. Którego wyrażenia regularnego mogę użyć? lub Którego podejścia można użyć do usunięcia wartości w ciągu?

(lub)

Jak przekonwertować wartości reprezentacji Unicode („& # 9940;” lub „& # 9889;” lub „& # 9888;”) na te same symbole (⛔, ⚡, ⚠) w ciągu?

1
nagaraju 19 listopad 2019, 18:01

3 odpowiedzi

Nie znalazłem takiego narzędzia w magazynie Java. Będziesz musiał to zrobić w „trudny” sposób.

Pamiętaj, że nie obejmuje to odpowiedników szesnastkowych (np. & # X26D4;) ani wartości dziesiętnych o długościach innych niż 4.

public static String htmlCharsDecode(String string) {
    int           length = string.length();
    StringBuilder out    = new StringBuilder(length);

    NumberFormat  parser = NumberFormat.getInstance();
    ParsePosition pos       = new ParsePosition(0);

    for (int i = 0; i < length; i++) {
        char c = string.charAt(i);

        if (c == '&' && i < length - 6 && string.charAt(i + 1) == '#' && string.charAt(i + 6) == ';') {
            String codepointString = string.substring(i + 2, i + 6);

            pos.setIndex(0);
            Number value = parser.parse(codepointString, pos);

            boolean isDecimal = pos.getIndex() == codepointString.length();
            if (isDecimal) {
                int codepoint = value.intValue();
                if (codepoint >= 9728 && codepoint <= 9999) {
                    out.append((char)codepoint);
                    i += 6;
                    continue;
                }
            }
        }

        out.append(c);
    }

    return out.toString();
}

Możesz ustawić parser i pos jako globalne, aby zapobiec tworzeniu nowych obiektów przy każdym wywołaniu, ale uważaj, ponieważ nie są one bezpieczne dla wątków. (i nie warto przedwcześnie optymalizować)

1
Mark Jeronimus 19 listopad 2019, 18:41

Istnieje kilka bibliotek, które mogą usunąć kod ucieczki encji HTML, np. JSoup Parser.unescapeEntities()< /a> metoda.

Jeśli chcesz po prostu usunąć emotikony, spójrz na tę odpowiedź, która wykorzystuje metodę filtrowania białej listy:

String input = "Last Validations ⛔ 0 ⚡ 1 ⚠ 6 ? 0";
String characterFilter = "[^\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s]";
String emotionless = input.replaceAll(characterFilter,""); 
System.out.println(emotionless); // Last Validations  0  1  6 ? 0
0
Karol Dowbecki 19 listopad 2019, 18:49

Musisz wyrenderować stronę w UTF-8 i powiedzieć w formie, że serwer akceptuje UTF-8 w danych formularza. (W przeciwnym razie jednostki &#...; są wysyłane zamiast symboli Unicode.)

<form action="..." accept-charset="ISO-8859-1">

W HTML 5:

<meta charset="UTF-8">

Starszy HTML:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

Należy również odpowiednio ustawić nagłówek odpowiedzi:

Content-Type: text/html; charset=UTF-8

response.setContentType("text/html; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
1
Joop Eggen 19 listopad 2019, 19:02