Java JTextPane HTML编辑器UTF-8字符编码

Java JTextPane HTML编辑器UTF-8字符编码,java,utf-8,character-encoding,html-entities,jtextpane,Java,Utf 8,Character Encoding,Html Entities,Jtextpane,我使用JTextPane作为简单的html编辑器 jtp=new JTextPane(); jtp.setContentType("text/html;charset=UTF-8"); jtp.setEditorKit(new HTMLEditorKit()); 当我调用jtp.getText()时,我得到了漂亮的html代码,其中所有特殊字符都已转义。但是我不想转义国家字符(波兰语),只想转义特殊的html字符,比如&, 当我进入编辑器时 <foo>ą ś & 但我想得

我使用JTextPane作为简单的html编辑器

jtp=new JTextPane();
jtp.setContentType("text/html;charset=UTF-8");
jtp.setEditorKit(new HTMLEditorKit());
当我调用jtp.getText()时,我得到了漂亮的html代码,其中所有特殊字符都已转义。但是我不想转义国家字符(波兰语),只想转义特殊的html字符,比如&, 当我进入编辑器时

<foo>ą ś &
但我想得到

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

它是如何可能的?

不可能,代码127以上的所有字符都被转换为一个数字实体和#编号。HTML实体被转换为命名实体<,等等。因此,您可以轻松地重新替换它们。(这是在HTMLWriter.output中完成的,而且似乎没有提供任何字符集。)

不幸的是,这是不可能的

内部有一个缺陷——它是硬编码的,用于将任何非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;
}


尽管上述步骤可行(我已经测试过了),但我当然不建议这样做。

我使用
charset=cp1251
而不是
charset=UTF-8
hmmm您是从文件还是从WWW获取这些数据???,因为您必须使用字符串值的适当字符集对缓冲区进行编码,所以我无法区分html实体和非html实体?到目前为止,我提供了pattern(&#[0-9]+),然后是StringEscapeUtils.unescapethml4($1)。看来你做得不错,我的意思是,通过解析你可以保持“,<和>不变,因为它们被命名为“兄弟”。我应该在哪里找到
HTMLDocumentHack
?兄弟,你也解决了我的问题,非常感谢你,我已经被困了两个星期了,谢谢老兄。
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;
}
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;
    }
}