【问题标题】:Java JTextPane HTML Editor UTF-8 characters encodingJava JTextPane HTML 编辑器 UTF-8 字符编码
【发布时间】:2011-11-30 11:22:01
【问题描述】:

我使用 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

标签: java utf-8 character-encoding html-entities jtextpane


【解决方案1】:

很遗憾,这是不可能的。

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
  • 兄弟,你也解决了我的问题,非常感谢,我已经卡了2周了,谢谢老兄。
【解决方案2】:

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

【讨论】:

  • 所以我无法区分 html-entities 和非 html-entities?到目前为止,我使用的是模式 ([0-9]+;),然后是 StringEscapeUtils.unescapeHtml4($1)。它似乎工作
  • 你做对了,我的意思是通过你的解析,你让 "、 保持不变,因为它们是 命名 实体,如 & ; .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 2012-07-24
  • 2012-03-24
  • 1970-01-01
相关资源
最近更新 更多