2010-02-18 6 views
7

Ich habe Strings wie:Wie konvertiere ich Sonderzeichen mit Java?

Avery® Laser & Inkjet Self-Adhesive 

brauche ich sie

Avery Laser & Inkjet Self-Adhesive. 

zu

konvertieren D.h. Entfernen Sie Sonderzeichen und konvertieren Sie HTML-Sonderzeichen in normale Zeichen.

+0

Ich bin interessiert, warum sind Sie die HTML immer codierten strings ... In meiner "idealen" App sollte der Programmierer niemals ... (einfach das Ergebnis html codieren, aber es empfangen ... nie) – helios

+0

Es ist Legacy-Code, der Daten speichert, es ist ein solches Rohformat, das ich lesen muss und wandle es um. – Vladimir

+2

Oh. Im Falle von seltsamen Zeichen ... sieht es so aus, als wäre es ursprünglich ein UTF-8-Zeichen und wurde als ISO-8859-1 (Western ISO) decodiert (gelesen) ... als Beispiel. Wenn Sie ein Ñ haben, hat es 2 Bytes in UTF-8, also, wenn Sie es in iso-western lesen, liest es zu fremden Zeichen. Wenn das der Fall ist und Sie wissen, dass die Codierungen, die Sie codieren, 'new String (byte [], encodingName)' und 'someString.getBytes (encodingName)' verwenden, um die guten Zeichen zu erhalten. – helios

Antwort

18
Avery® Laser & Inkjet Self-Adhesive

Erster Einsatz StringEscapeUtils#unescapeHtml4() (oder #unescapeXml(), je nach das ursprüngliche Format), um die & in zu einem &. Dann verwenden Sie String#replaceAll() mit [^\x20-\x7e], um Zeichen loszuwerden, die nicht innerhalb der printable ASCII range liegen.

Zusammengefasst:

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

..welche

Avery Laser & Inkjet Self-Adhesive

erzeugt (ohne den abschließenden Punkt wie in Ihrem Beispiel, aber das war im Original nicht vorhanden;))

Das heißt, dies sieht jedoch eher nach einer Anfrage Workaround als eine Anfrage an Lösung. Wenn Sie mehr über die funktionale Anforderung und/oder den Ursprung dieser Zeichenfolge erfahren, können wir möglicherweise die richtige Lösung bereitstellen. Die ® sieht nämlich so aus, als ob die falsche Codierung verwendet wird, um die Zeichenfolge einzulesen, und die & sieht so aus, als ob sie durch Verwendung eines textbasierten Parsers anstelle eines vollwertigen HTML-Parsers die Zeichenfolge einliest.

+0

Yep, trailing dot ist mein Tippfehler) Sie haben recht, wenn Sie sagen, dass diese Art von Strings das Ergebnis eines textbasierten Parsers ist, der html liest. – Vladimir

1

Vielleicht können Sie so etwas wie verwenden:

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

in einem Projekt ich etwas tat, wie:

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

Das bedeutet, dass Sie jedes Vorkommen jedes Platzhalters im HTML-Code entschlüsseln müssen, was ein Schmerz ist, besonders wenn jemand es bereits für Sie geschrieben hat. –

+0

Das würde funktionieren, aber es ist kein idealer Ansatz.Um dies zu tun, müssten Sie eine Menge aller zu ersetzenden Sonderzeichen erstellen (und beibehalten). Es ist besser, eine vorhandene Bibliothek oder einen vorhandenen Encoder zu verwenden, als den manuellen Austausch, wenn möglich. Es ist auch einfacher und weniger mühsam zu implementieren! – Freiheit

1

Incase wollen Sie imitieren, was PHP-Funktion htmlspecialchars_decode tut PHP-Funktion get_html_translation_table() verwenden, um die Tabelle zu entleeren und dann den Java-Code verwenden, wie,

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