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

3
我正在使用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;

这怎么可能?

我使用 charset=cp1251 而不是 charset=UTF-8 - mKorbel
你是从文件还是从网络获取这些数据的?如果是,则必须使用适当的字符集对缓冲区进行编码以转换为字符串值。 - mKorbel
2个回答

4
很遗憾,这是不可能的。 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;
    }
}

尽管上述步骤可行(我已测试),但我肯定不建议这样做。

兄弟,我应该在哪里找到“HTMLDocumentHack”? - user2889419
兄弟,你也解决了我的问题,非常感谢,我已经卡了两个星期了,谢谢老兄。 - user2889419

0

不可能的,所有大于代码127的字符都被翻译成数字实体& # number ;。HTML实体被翻译成命名实体& lt ;,等等。因此,您可以轻松地重新替换它们。(这是在HTMLWriter.output中完成的,似乎没有任何关于字符集的规定。)


那么我无法区分 HTML 实体和非 HTML 实体吗?目前,我使用了模式(&#[0-9]+;),然后再使用 StringEscapeUtils.unescapeHtml4($1)。看起来它是有效的。 - karolkpl
你做得对,我是指你的解析过程将“,<”和“>”保持不变,因为它们像& quot;一样是命名实体。 - Joop Eggen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接