ASCII в HTML-сущности, выходящие из Java - PullRequest
3 голосов
/ 26 марта 2011

Я нашел этот сайт с escape-кодами, и мне просто интересно, если кто-то уже сделал это, поэтому мне не нужно тратить пару часов на создание этой логики:

 StringBuffer sb = new StringBuffer();
 int n = s.length();
 for (int i = 0; i < n; i++) {
     char c = s.charAt(i);
     switch (c) {
         case '\u25CF': sb.append("&#9679;"); break;
         case '\u25BA': sb.append("&#9658;"); break;

         /*
         ... the rest of the hex chars literals to HTML entities
         */  

         default:  sb.append(c); break;
     }
 }

Ответы [ 3 ]

2 голосов
/ 26 марта 2011

Эти "коды" являются простым десятичным представлением значения Unicode фактического символа.Мне кажется, что-то подобное будет работать, если только вы не хотите быть очень строгими в отношении того, какие коды преобразуются, а какие нет.

StringBuilder sb = new StringBuilder();
 int n = s.length();
 for (int i = 0; i < n; i++) {
     char c = s.charAt(i);
     if (Character.UnicodeBlock.of(c) != Character.UnicodeBlock.BASIC_LATIN) {
        sb.append("&#");
        sb.append((int)c);
        sb.append(';');
     } else {
        sb.append(c);
     }

 }
1 голос
/ 05 мая 2016

Другие ответы не работают правильно для суррогатных пар, например, если у вас есть смайлики, такие как «?» (см. информация о символах ).Вот как это сделать в Java 8:

StringBuilder sb = new StringBuilder();
s.codePoints().forEach(codePoint -> {
    if (Character.UnicodeBlock.of(codePoint) != Character.UnicodeBlock.BASIC_LATIN) {
        sb.append("&#");
        sb.append(codePoint);
        sb.append(';');
    } else {
        sb.appendCodePoint(codePoint);
    }
});

А для более старой Java:

StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); ) {
    int c = s.codePointAt(i);
    if (Character.UnicodeBlock.of(c) != Character.UnicodeBlock.BASIC_LATIN) {
        sb.append("&#");
        sb.append(c);
        sb.append(';');
    } else {
        sb.appendCodePoint(c);
    }
    i += Character.charCount(c);
}

Простой способ проверить, правильно ли решение обрабатывает суррогатные пары, - это использовать "\uD83D\uDE00"(?) в качестве входа.Если вывод "&#55357;&#56832;", то это неправильно.Правильный вывод &#128512;.

0 голосов
/ 26 марта 2011

Хм, а если бы вы сделали что-то вроде этого:

if (c > 127) {
    sb.append("&#" + (int) c + ";");
} else {
    sb.append(c);
}

Тогда вам просто нужно определить диапазон символов, которые вы хотите чтобы экранировал HTML. В этом случае я просто указал любой символ, кроме табличного пространства ASCII.

...