2010-05-18 6 views
2

J'utilise java library Tidy pour nettoyer le code html. Une partie du code contient des liens avec des lettres russes. Par exempleTidy rompt les liens avec les caractères non latins

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

Je comprends que « Русский » doit être échappé, mais je reçois ce code HTML des utilisateurs. Et mon travail consiste à le convertir en XHTML.

Je pense bien rangé tente d'échapper à lettres non-latin, mais en conséquence je reçois

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

Ce n'est pas corect. version correcte est

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

code Java est

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

Répondre

1

Il est un comportement codé en dur et il est probablement un bug. Ils utilisent UTF-16 pour échapper les caractères non ASCII dans les URL lorsqu'ils devraient utiliser UTF-8. Voir org/w3c/tidy/AttrCheckImpl.java.

+0

Merci. Je vais demander à mon ami, qui sait java, de corriger ce bug correctement et de l'envoyer à l'équipe de Tidy. – Alexei

Questions connexes