Frage

Ich habe eine Zeichenfolge, die lockige Zitate enthält. Ich möchte Menschen durch HTML -Unternehmen ersetzen, um sicherzustellen, dass sie andere nachgeschaltete Systeme nicht verwirren. Für meinen ersten Versuch habe ich gerade die Zeichen für die Charaktere hinzugefügt, die ich ersetzen wollte, und habe sie direkt in meinen Code eingeben:

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();
}

Dies wurde auf meinem Mac zusammengestellt und funktioniert gut, aber als unser CI -Server (der unter Linux ausgeführt wird) versucht, ihn zu bauen, erstickte es:

Out.java:[347,16] duplicate case label

Anscheinend kann ein Teil der Build -Kette auf der Linux -Box diese schicken Charaktere nicht erkennen und unterscheiden.

Mein nächster Versuch war es, Unicode zu entkommen. Leider wird dies nicht einmal auf meinem Mac kompilieren:

...
            case '\u8220':
                sb.append("&#8220;");
                break;
            case '/u8221':
                sb.append("&#8221;");
                break;
...

Mein Compiler wirft diese Beschwerde aus:

Out.java:[346,21] unclosed character literal

Ich bin verblüfft darüber, wie man diesen Substitution durchführen und es zuverlässig über Plattformen hinweg funktioniert. Hat jemand Zeiger? Danke im Voraus.

War es hilfreich?

Lösung

Das Compiler -Problem liegt daran, dass Sie '/u8221' anstelle von ' u8221' haben - einen Vorwärtsschild anstelle eines Backslashs.

Ich bin nicht ganz davon überzeugt, dass die Verwendung der Entitäten helfen wird, aber Sie können es versuchen ... Ich nehme an, es hängt davon ab, wie gebrochen der nachgelagerte Code ist.

EDIT: Doh, ich hatte nicht festgestellt, dass Ihre Unicode -Werte in Dezimal gehalten wurden. Ja, sie müssen in Hex sein :) Ich werde diese Antwort hier hinterlassen, da sie erklärt, warum sich der Compiler beschwert hat - ' U8221' ist eine perfekt charakteristische Fluchtsequenz, nur nicht die, die Sie wollten :)

Andere Tipps

Sie können den buchstäblichen Charakter (dh,, verwenden, '‘'), aber Ihr Erstellungsprozess muss die richtige Quellcodierung während der Zusammenstellung angeben. Das javac Befehlsoption ist -encoding. (Das Attribut für Ameisen javac Die Aufgabe ist gleich.) Dies sollte mit der von Ihrer IDE verwendeten Codierung mit dem Speichern der Dateien übereinstimmen.

Wenn Ihre IDE beispielsweise UTF-8 verwendet, die Build-Maschine jedoch die Plattform-Standardcodierung von US-ASCII verwendet, werden die Sonderzeichen dekodiert wie ?. Da mehrere Fälle jetzt dieselbe Beschriftung haben, erhalten Sie die ursprüngliche Fehlermeldung.

Unicode -Literale sind in hexadezimal:

case '\u201c':
    sb.append("&#8220;");
    break;
....

Und wie in den anderen Antworten erwähnt, haben Sie eine / anstelle einer \ in einem Ihrer Literale.

Die Standardcodierung variiert von Plattform zu Plattform-Windows verwendet einen eigenen ISO-Latin-1-Dialekt (zumindest diejenigen, an denen ich gearbeitet habe). Linux verwenden häufig UTF-8 (was höchstwahrscheinlich Ihr Problem ist) und Mac verwendet Makroman. Sie können die meisten Ihrer Probleme umgehen, indem Sie sich auf 7-Bit-ASCII halten und u für etwas darüber verwenden, wenn Sie es in Ihrem Quellcode benötigen.

Persönlich würde ich alles "nationale" außerhalb der Java -Quelle behalten und die Lokalisierungsfunktionen verwenden, um übersetzte Saiten nach einfachen Schlüsseln und nachzuschlagen sie werden in Ihrem Java -Code platziert.

Ein besserer Ansatz wäre die Verwendung von Apache Commons Lang http://commons.apache.org/lang/api/org/apache/commons/lang/stringescapeutils.html.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top