5 Stimmen

Problem beim Trimmen einer japanischen Zeichenkette in Java

Ich habe die folgende Zeichenfolge (japanisch) "" Das erste Zeichen ist ein Leerzeichen, aber seine Nummer in Unicode ist 12288. Wenn ich also "".trim() ausführe, erhalte ich denselben String (trim funktioniert nicht). Wenn ich trim in C++ ausführe, funktioniert es gut. Weiß jemand, wie man dieses Problem in Java lösen kann? Gibt es eine spezielle Trim-Methode für Unicode?

8voto

Fabian Steeg Punkte 43903

Als Alternative zum StringUtils Klasse, die Mike erwähnt hat, können Sie auch einen Unicode-fähigen regulären Ausdruck verwenden, der nur die Java-eigenen Bibliotheken nutzt:

"".replaceAll("\\p{Z}", "")

Oder, um wirklich nur zu trimmen, und nicht entfernen Leerzeichen innerhalb der Zeichenfolge:

"  ".replaceAll("(^\\p{Z}+|\\p{Z}+$)", "")

4voto

McDowell Punkte 105255

をご覧ください。 Unicode-Normalisierung und die Normalisierer Klasse. Die Klasse ist neu in Java 6, aber Sie finden eine entsprechende Version in der ICU4J Bibliothek, wenn Sie eine frühere JRE verwenden.

    int character = 12288;
    char[] ch = Character.toChars(character);
    String input = new String(ch);
    String normalized = Normalizer.normalize(input, Normalizer.Form.NFKC);

    System.out.println("Hex value:\t" + Integer.toHexString(character));
    System.out.println("Trimmed length           :\t"
            + input.trim().length());
    System.out.println("Normalized trimmed length:\t"
            + normalized.trim().length());

3voto

Mike Sickler Punkte 31956

Versuchen Sie die Apache Commons'. StringUtils Klasse. Die Methode StringUtils.strip() sollte für Sie funktionieren.

2voto

Paul Whelan Punkte 16284

In den Java-Dokumenten wird erklärt, warum dies nicht funktioniert.

Wenn dieses String-Objekt eine leere Zeichenfolge darstellt, oder die ersten und das letzte Zeichen der Zeichenfolge Zeichenfolge, die durch dieses String Objekt repräsentiert werden, beide einen Code größer als ' \u0020 ' (das Leerzeichen), dann ein Verweis auf dieses String-Objekt zurückgegeben.

Sie könnten Ihre eigene Version leicht erstellen. Vielleicht könnte die Methode codePointAt für diesen Zweck verwendet werden.

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html

2voto

Michael Borgwardt Punkte 334642

Sie müssen Ihre eigenen Texte schreiben trim() Methode basierend auf Character.isWhitespace() - leider, trim() tut nicht das, was sein API-Dokument behauptet: Es entfernt nur ASCII-Leerzeichen, keine anderen Arten von Leerzeichen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X