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("&#8220;");
                break;
            case '”':
                sb.append("&#8221;");
                break;
            case '‘':
                sb.append("&#8216;");
                break;
            case '’':
                sb.append("&#8217;");
                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("&#8220;");
                break;
            case '/u8221':
                sb.append("&#8221;");
                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.

È stato utile?

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("&#8220;");
    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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top