Tidy打破了与非拉丁字符的联系

时间:2010-05-18 18:35:31

标签: java urlencode tidy

我使用java库Tidy来清理html代码。一些代码包含俄语字母的链接。例如

<a href="http://example.com/Русский">link with Russian letters</a>

我理解“Русский”必须转义,但我从用户那里获得了这个HTML。我的工作是将其转换为XHTML。

我觉得整齐试图逃避非拉丁字母,但结果我得到了

<a href="http://example.com/%420%443%441%441%43A%438%439">link with Russian letters</a>

这不是核心。正确的版本是

<a href="http://example.com/%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9">link with Russian letters</a>

Java代码

private static Tidy getTidy() {
    if (null == tidy) {
      tidy = new Tidy();
      tidy.setQuiet(true);
      tidy.setShowErrors(0);
      tidy.setShowWarnings(false);
      tidy.setXHTML(true);
      tidy.setOutputEncoding("UTF-8");
    }
    return tidy;
}

public static String sanitizeHtml(String html, URI pageUri) {
    boolean escapeMedia = false;
    String ret = "";
    try {
      Document doc = getTidy().parseDOM(new StringReader("<body>" + html + "</body>"), null);

      // here I make some processing

      // string output
      ByteArrayOutputStream out = new ByteArrayOutputStream();
      Node node = doc.getElementsByTagName("body").item(0);
      getTidy().pprint(node, out);
      ret = out.toString().trim();
    }
    catch (Exception e) {
      ret = html;
      e.printStackTrace();
    }

    return ret;
}

1 个答案:

答案 0 :(得分:1)

这是一种硬编码行为,它可能是一个错误。当他们使用UTF-8时,他们使用UTF-16来转义URL中的非ASCII字符。请参阅org/w3c/tidy/AttrCheckImpl.java