package org.lodder.subtools.sublibrary.xml; /** * Source: http://www.rgagnon.com/javadetails/java-0307.html */ import java.util.HashMap; public class StringUtils { private StringUtils() {} private static HashMap<String, String> htmlEntities; static { htmlEntities = new HashMap<String, String>(); htmlEntities.put("<", "<"); htmlEntities.put(">", ">"); htmlEntities.put("&", "&"); htmlEntities.put(""", "\""); htmlEntities.put("à", "à"); htmlEntities.put("À", "À"); htmlEntities.put("â", "â"); htmlEntities.put("ä", "ä"); htmlEntities.put("Ä", "Ä"); htmlEntities.put("Â", "Â"); htmlEntities.put("Ã", "Ã"); htmlEntities.put("ã", "ã"); htmlEntities.put("å", "å"); htmlEntities.put("Å", "Å"); htmlEntities.put("æ", "æ"); htmlEntities.put("Æ", "Æ"); htmlEntities.put("ç", "ç"); htmlEntities.put("Ç", "Ç"); htmlEntities.put("é", "é"); htmlEntities.put("É", "É"); htmlEntities.put("è", "è"); htmlEntities.put("È", "È"); htmlEntities.put("ê", "ê"); htmlEntities.put("Ê", "Ê"); htmlEntities.put("ë", "ë"); htmlEntities.put("Ë", "Ë"); htmlEntities.put("ï", "ï"); htmlEntities.put("Ï", "�?"); htmlEntities.put("ô", "ô"); htmlEntities.put("Ô", "Ô"); htmlEntities.put("ö", "ö"); htmlEntities.put("Ö", "Ö"); htmlEntities.put("ø", "ø"); htmlEntities.put("Ø", "Ø"); htmlEntities.put("ß", "ß"); htmlEntities.put("ù", "ù"); htmlEntities.put("Ù", "Ù"); htmlEntities.put("û", "û"); htmlEntities.put("Û", "Û"); htmlEntities.put("ü", "ü"); htmlEntities.put("Ü", "Ü"); htmlEntities.put(" ", " "); htmlEntities.put("©", "\u00a9"); htmlEntities.put("®", "\u00ae"); htmlEntities.put("€", "\u20a0"); htmlEntities.put("¡", "¡"); } /* * Here the original recursive version. It is fine unless you pass a big string then a Stack * Overflow is possible :-( * * * public static final String unescapeHTML(String source, int start){ int i,j; * * i = source.indexOf("&", start); if (i > -1) { j = source.indexOf(";" ,i); if (j > i) { String * entityToLookFor = source.substring(i , j + 1); String value = * (String)htmlEntities.get(entityToLookFor); if (value != null) { source = new * StringBuffer().append(source.substring(0 , i)) .append(value) .append(source.substring(j + 1)) * .toString(); return unescapeHTML(source, i + 1); // recursive call } } } return source; } * * M. McNeely Jr. has sent a version with do...while()loop which is more robust. Thanks to him! */ public static final String unescapeHTML(String source) { int i, j; boolean continueLoop; int skip = 0; do { continueLoop = false; i = source.indexOf("&", skip); if (i > -1) { j = source.indexOf(";", i); if (j > i) { String entityToLookFor = source.substring(i, j + 1); String value = htmlEntities.get(entityToLookFor); if (value != null) { source = source.substring(0, i) + value + source.substring(j + 1); continueLoop = true; } else { skip = i + 1; continueLoop = true; } } } } while (continueLoop); return source; } }