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,你可以做一些疯狂的事情 :
- 将HTMLWriter源复制并粘贴到
HTMLWriterHack
(在同一个包javax.swing.text.html
并重命名所有字符串) - 用
output(String.valueOf(chars[counter]));
替换上面列出的三个output
行output(String.valueOf(chars[counter]));
- 将HTMLDocument源复制并粘贴到
HTMLDocumentHack
(在相同的包javax.swing.text.html
,重命名所有字符串,使其扩展HTMLDocument
并删除冲突方法) - 使用下面列出的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中完成的,似乎没有任何字符集的规定。)