2010-05-18 1 views
2

Я использую java-библиотеку Tidy для дезинфекции html-кода. В некотором коде содержатся ссылки с русскими буквами. Например,Tidy разрывает ссылки с не-латинскими символами

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

Это не Corect. Правильная версия

<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

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

+0

Спасибо. Я попрошу моего друга, который знает java, правильно исправить эту ошибку и отправить команду в порядке. – Alexei