17.28 Text in HTML-konformen Text umwandeln
 
Beliebiger Text kann nicht ohne weiteres in eine HTML-Datei wandern, da viele Symbole für den Browser von besonderer Bedeutung sind. Daher müssen wir sie vorher konvertieren. Ein einfaches Programm zur HTML-Ausgabe haben wir im Zusammenhang mit Datenströmen kennen gelernt. Wir wollen dies nun weiterführen und eine statische Funktion escape(String) angeben, die eine Zeichenkette nimmt und als Rückgabewert eine HTML-reine Zeichenkette liefert.
Listing 17.27
HTMLEscape.java
public class HTMLEscape
{
public static String escape( String s )
{
int len = s.length();
StringBuffer sb = new StringBuffer(len*5/4);
for ( int i = 0; i < len; i++ )
{
char c = s.charAt( i );
String elem = htmlchars[c&0xff];
sb.append( elem == null ? ""+c : elem );
}
return sb.toString();
}
private static String htmlchars[] = new String[256];
static
{
String entry[] = {
"nbsp", "iexcl", "cent", "pound", "curren", "yen", "brvbar",
"sect", "uml", "copy", "ordf", "laquo", "not", "shy", "reg",
"macr", "deg", "plusmn", "sup2", "sup3", "acute", "micro",
"para", "middot", "cedil", "sup1", "ordm", "raquo", "frac14",
"frac12", "frac34", "iquest",
"Agrave", "Aacute", "Acirc", "Atilde", "Auml", "Aring", "AElig",
"CCedil", "Egrave", "Eacute", "Ecirc", "Euml", "Igrave", "Iacute",
"Icirc", "Iuml", "ETH", "Ntilde", "Ograve", "Oacute", "Ocirc",
"Otilde", "Ouml","times", "Oslash", "Ugrave", "Uacute", "Ucirc",
"Uuml", "Yacute", "THORN", "szlig",
"agrave", "aacute", "acirc", "atilde", "auml", "aring", "aelig",
"ccedil", "egrave", "eacute", "ecirc", "euml", "igrave", "iacute",
"icirc", "iuml", "eth", "ntilde", "ograve", "oacute", "ocirc",
"otilde", "ouml", "divid", "oslash", "ugrave", "uacute", "ucirc",
"uuml", "yacute", "thorn", "yuml"
};
htmlchars['&'] = "&";
htmlchars['<'] = "<";
htmlchars['>'] = ">";
for ( int c = '\u00A0', i=0 ; c <= '\u00FF'; c++, i++ )
htmlchars[c] = "&"+entry[i]+";";
for ( int c = '\u0083', i=131 ; c <= '\u009f'; c++, i++ )
htmlchars[c] = "&#"+i+";";
htmlchars['\u0088']=htmlchars['\u008D']=htmlchars['\u008E'] = null;
htmlchars['\u008F']=htmlchars['\u0090']=htmlchars['\u0098'] = null;
htmlchars['\u009D'] = null;
}
public static void main( String args[] )
{
String s = "Das ist <B><I>HTML in Tags</I></B>!";
System.out.println( "-> " + s );
System.out.println( "<- " + HTMLEscape.escape(s) );
}
}
Unsere Klasse initialisiert zunächst im static-Block einmalig eine Umwandlungstabelle. Da wir nicht mehr als 256 Zeichen erwarten, assoziieren wir mit einem Zeichen entweder ein druckbares gültiges Zeichen oder ein Sonderzeichen, das durch ein Kürzel der Art &XXX; ausgedrückt wird. In einem Feld von 256 Strings speichern wir daher entweder das Kürzel oder lassen das Feldelement uninitialisiert, dann aber steht dort null, und wir wissen, dass sich dahinter das Originalzeichen verbirgt. In der escape()-Funktion laufen wir dann die Zeichenkette ab und sehen für jedes Zeichen im Feld nach, ob sich dort ein Kürzel befindet. Wenn ja, dann setzen wir es in das Ergebnis ein. Wenn wir das Ganze noch als OutputStreamFilter oder Writer implementierten, würde dies die Sache noch mehr vereinfachen.
|