Java JTextPane HTML Editor UTF-8 кодировка символов - PullRequest
3 голосов
/ 30 ноября 2011

Я использую JTextPane в качестве простого редактора html.

jtp=new JTextPane();
jtp.setContentType("text/html;charset=UTF-8");
jtp.setEditorKit(new HTMLEditorKit());

Когда я вызываю jtp.getText (), я получаю хороший html-код со всеми экранированными специальными символами.Но я не хочу экранировать национальные символы (польский), а только специальные html-символы, такие как &, <,> Когда я вхожу в редактор

<foo>ą ś &

, я получаю

&lt;foo&gt;&#261; &#347; &amp;

, но яхотел бы получить

&lt;foo&gt;ą ś &amp;

Как это возможно?

Ответы [ 2 ]

4 голосов
/ 30 ноября 2011

К сожалению, это невозможно.

Есть недостаток внутри javax.swing.text.html.HTMLWriter - он жестко закодирован для преобразования любого символа, не являющегося ASCII, в его числовое представление:

default:
    if (chars[counter] < ' ' || chars[counter] > 127) {
        if (counter > last) {
            super.output(chars, last, counter - last);
        }
        last = counter + 1;
        // If the character is outside of ascii, write the
        // numeric value.
        output("&#");
        output(String.valueOf((int)chars[counter]));
        output(";");
    }
    break;
}

Эта логика никак не может контролироваться.

НО Если вам на самом деле нужна эта функциональность, вы можете сделать сумасшедшие вещи :

  1. копирование и вставка HTMLWriter источников в HTMLWriterHack (в одном пакете javax.swing.text.html и переименование всех строк внутри)
  2. Замените перечисленные выше три output строки чем-то вроде output(String.valueOf(chars[counter]));
  3. копирование и вставка HTMLDocument источников в HTMLDocumentHack (в одном пакете javax.swing.text.html, переименование всех строк внутри, расширение до HTMLDocument и удаление методов столкновения)
  4. Используйте перечисленный ниже CustomEditorKit вместо HTMLEditorKit

class CustomEditorKit extends HTMLEditorKit {
    @Override
    public void write(Writer out, Document doc, int pos, int len) throws IOException, BadLocationException {
        HTMLWriterHack writer = new HTMLWriterHack(out, (HTMLDocumentHack) doc);
        writer.write();
    }
    @Override
    public Document createDefaultDocument() {
        StyleSheet styles = getStyleSheet();
        StyleSheet ss = new StyleSheet();
        ss.addStyleSheet(styles);
        HTMLDocumentHack doc = new HTMLDocumentHack(ss);
        doc.setParser(getParser());
        doc.setAsynchronousLoadPriority(4);
        doc.setTokenThreshold(100);
        return doc;
    }
}

Хотя описанные выше шаги работают (я проверял это), я, конечно, не рекомендовал бы делать это.

0 голосов
/ 30 ноября 2011

Это невозможно, все символы выше кода 127 переводятся в числовой объект & # number; .HTML-сущности переводятся в именованные сущности & lt; и т. Д.Таким образом, вы можете легко заменить их. (Это делается в HTMLWriter.output, и, похоже, нет никаких положений для наборов символов.)

...