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

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

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

当我调用jtp.getText()时,我获得了很好的html代码,所有特殊字符都被转义。 但是我不希望逃避国家角色(波兰语),但只有特殊的html字符,如&,当我进入编辑器时

 ą ś & 

我明白了

 <foo>ą ś & 

但我想得到

 <foo>ą ś & 

怎么可能?

不幸的是,这是不可能的。

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; } 

无法以任何方式控制此逻辑。

如果你真的需要这个function,你可以做一些疯狂的事情

  1. 将HTMLWriter源复制并粘贴到HTMLWriterHack (在同一个包javax.swing.text.html并重命名所有字符串)
  2. output(String.valueOf(chars[counter]));替换上面列出的三个outputoutput(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; } } 

虽然上面的步骤(我测试过),我当然不会建议这样做。

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