Come HTML sfuggire le virgolette in una stringa Java
-
20-09-2019 - |
Domanda
Ho una stringa che ha le virgolette in esso. Mi piacerebbe sostituire quelli con entità HTML per assicurarsi che essi non confondere altri sistemi a valle. Per il mio primo tentativo, ho solo aggiunto di corrispondenza per i personaggi che volevo sostituire, entrando direttamente nel mio codice:
public static String escapeXml(String s) {
StringBuilder sb = new StringBuilder();
char characters[] = s.toCharArray();
for ( int i = 0; i < characters.length; i++ ) {
char c = characters[i];
switch (c) {
// other escape characters deleted for clarity
case '“':
sb.append("“");
break;
case '”':
sb.append("”");
break;
case '‘':
sb.append("‘");
break;
case '’':
sb.append("’");
break;
default:
sb.append(c);
break;
}
}
return sb.toString();
}
Questa compilato e funzionava bene sul mio Mac, ma quando il nostro server CI (che gira su Linux) ha cercato di costruire, è soffocato:
Out.java:[347,16] duplicate case label
A quanto pare una parte della catena di compilazione sulla scatola di Linux non può riconoscere e distinguere tra questi personaggi di fantasia.
Il mio prossimo tentativo è stato quello di utilizzare Unicode fuga. Purtroppo, questo non sarà anche compilare sul mio Mac:
...
case '\u8220':
sb.append("“");
break;
case '/u8221':
sb.append("”");
break;
...
Il mio compilatore genera questa denuncia:
Out.java:[346,21] unclosed character literal
Sono sconcertato di come si possa fare questo po 'di sostituzione e farlo funzionare in modo affidabile tra le piattaforme. Qualcuno ha di puntatori? Grazie in anticipo.
Soluzione
Il problema del compilatore è perché hai '/ u8221' al posto del '\ u8221' - una barra al posto di un backslash
.Io non sono del tutto convinto che utilizzando le entità aiuterà, ma si può provare ... Suppongo che dipende da come rotto il codice a valle è.
EDIT: Doh, non avevo notato che i valori Unicode erano in decimale. Sì, hanno bisogno di essere in formato esadecimale :) Lascio questa risposta qui in quanto spiega perché il compilatore si lamentava - '\ u8221' è una perfetta sequenza di caratteri di escape, non solo quello che volevi:)
Altri suggerimenti
È possibile utilizzare il carattere letterale (vale a dire, '‘'
), ma il vostro processo di generazione ha bisogno di specificare la codifica sorgente corretta durante la compilazione. L'opzione di comando javac
è -encoding
. (L'attributo sul compito javac
di Ant è lo stesso). Questo dovrebbe corrispondere qualsiasi codifica utilizzato dal vostro IDE durante il salvataggio dei file.
Se il vostro IDE utilizza UTF-8, per esempio, ma la macchina di costruzione sta usando la sua piattaforma di default codifica US-ASCII, i caratteri speciali saranno decodificati come ?
. Dal momento che più casi hanno ora la stessa etichetta, si ottiene il messaggio di errore originale.
letterali Unicode sono in esadecimale:
case '\u201c':
sb.append("“");
break;
....
E, come detto nelle altre risposte, hai un /
invece di un \
in uno dei tuoi letterali.
La codifica predefinita varia a seconda della piattaforma - Windows utilizza la propria ISO-Latin-1 dialetto (almeno quelli che ho lavorato). Linux utilizzano frequentemente UTF-8 (che è più probabile il problema) e Mac utilizza MacRoman. È possibile aggirare la maggior parte dei vostri problemi, mantenendo al semplice 7-bit ASCII, e l'utilizzo di \ u per qualsiasi cosa sopra che se ne avete bisogno nel codice sorgente.
Personalmente vorrei tenere nulla "nazionale" al di fuori della sorgente Java, e utilizzare le funzioni di localizzazione per cercare stringhe tradotte per i tasti semplici e che vengono inseriti nel codice Java.
Un approccio migliore sarebbe quella di utilizzare Apache Commons Lang http://commons.apache.org/lang/api/org/apache/commons/lang/StringEscapeUtils.html .