Tidy разрывает связи с нелатинскими буквами - PullRequest
2 голосов
/ 18 мая 2010

Я использую библиотеку Java Tidy для очистки html-кода. Часть кода содержит ссылки с русскими буквами. Например

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

Я понимаю, что "Русский" должен быть экранирован, но я получаю этот html от пользователей. И моя работа заключается в том, чтобы преобразовать его в XHTML.

Я думаю, что Tidy пытается убрать нелатинские буквы, но в результате я получаю

<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 Ответ

1 голос
/ 18 мая 2010

Это жестко запрограммированное поведение и, вероятно, ошибка. Они используют UTF-16 для экранирования не-ASCII символов в URL, когда им следует использовать UTF-8 См. org/w3c/tidy/AttrCheckImpl.java.

...