2010-02-18 30 views
7

tengo cadenas como:¿Cómo convierto caracteres especiales usando java?

Avery® Laser & Inkjet Self-Adhesive 

tengo que convertirlos a

Avery Laser & Inkjet Self-Adhesive. 

es decir, eliminar caracteres especiales y convertir html caracteres especiales a los normales.

+0

estoy interesado en por qué está usted recibiendo el código HTML codificada cuerdas ... En mi aplicación "ideal" el programador nunca debería tener que ... (simplemente codifica para html el resultado, pero lo recibe ... nunca) – helios

+0

Es un código heredado que guarda los datos en formato raw que necesito leer y convertirlo. – Vladimir

+2

Oh. En el caso de caracteres extraños ... parece que originalmente era un carácter UTF-8 y se decodificó (se leyó) como ISO-8859-1 (ISO occidental) ... por ejemplo. Si tiene un Ñ, tiene 2 bytes en UTF-8, por lo que si lo lee en iso-western, se lee en caracteres extraños. Si es el caso y usted conoce las codificaciones, use el código 'new String (byte [], encodingName)' y 'someString.getBytes (encodingName)' para obtener los caracteres correctos. – helios

Respuesta

18
Avery® Laser & Inkjet Self-Adhesive

Primer uso StringEscapeUtils#unescapeHtml4() (o #unescapeXml(), dependiendo de el formato original) para unescape del & en a &. Luego use String#replaceAll() con [^\x20-\x7e] para deshacerse de los caracteres que no están dentro del printable ASCII range.

resumirse así:

String clean = StringEscapeUtils.unescapeHtml4(dirty).replaceAll("[^\\x20-\\x7e]", ""); 

..which produce

Avery Laser & Inkjet Self-Adhesive

(sin el punto de salida como en su ejemplo, pero que no estaba presente en el original;))

Sin embargo, esto parece más una solicitud de solución alternativa que una solicitud a solución. Si elabora más sobre el requisito funcional y/o dónde se originó esta cadena, podemos proporcionar la solución derecha. El ® parece ser causado por el uso de una codificación incorrecta para leer la cadena y el aspecto & parece ser causado por el uso de un analizador basado en texto para leer la cadena en lugar de un analizador HTML completo.

+0

Sí, el punto final es mi error ortográfico) Tienes razón en decir que este tipo de cadenas son el resultado del analizador basado en texto que lee html. – Vladimir

1

Tal vez se puede usar algo como:

yourTxt = yourTxt.replaceAll("&", "&"); 

en algún proyecto que hice algo como:

public String replaceAcutesHTML(String str) { 

str = str.replaceAll("á","á"); 
str = str.replaceAll("é","é"); 
str = str.replaceAll("í","í"); 
str = str.replaceAll("ó","ó"); 
str = str.replaceAll("ú","ú"); 
str = str.replaceAll("Á","Á"); 
str = str.replaceAll("É","É"); 
str = str.replaceAll("Í","Í"); 
str = str.replaceAll("Ó","Ó"); 
str = str.replaceAll("Ú","Ú"); 
str = str.replaceAll("ñ","ñ"); 
str = str.replaceAll("Ñ","Ñ"); 

return str; 

}

+0

Eso significa que debe eliminar cada ocurrencia de cada marcador de posición en HTML, lo cual es un problema, especialmente cuando alguien ya lo ha escrito para usted. –

+0

Eso funcionaría, pero no es un enfoque ideal.Para hacer eso tendrías que construir (y mantener) un conjunto de todos los caracteres especiales para reemplazar. Es mejor usar una biblioteca o codificador existente que hacer reemplazos manuales cuando sea posible. ¡También resulta más fácil y menos tedioso de implementar! – Freiheit

1

En caso que usted quiere imitar lo htmlspecialchars_decode función de PHP hace uso de la función php get_html_translation_table() para volcar la mesa y luego utilizar el código Java como,

static Hashtable html_specialchars_table = new Hashtable(); 
    static { 
      html_specialchars_table.put("&lt;","<"); 
      html_specialchars_table.put("&gt;",">"); 
      html_specialchars_table.put("&amp;","&"); 
    } 
    static String htmlspecialchars_decode_ENT_NOQUOTES(String s){ 
      Enumeration en = html_specialchars_table.keys(); 
      while(en.hasMoreElements()){ 
        String key = (String)en.nextElement(); 
        String val = (String)html_specialchars_table.get(key); 
        s = s.replaceAll(key, val); 
      } 
      return s; 
    } 
Cuestiones relacionadas