Frage

Ich habe versucht, char-Literale für akzentuierte Vokale in Java zu schreiben, aber die Compiler sagt etwas wie: unclosed Zeichenliteral

Das ist, was ich versuche zu tun:

 char [] a = {'à', 'á', 'â', 'ä' };

Ich habe versucht, Unicode '\u00E0' verwenden, aber aus irgendeinem Grund nicht mit meinem Code übereinstimmen:

 for( char c : string.toCharArray() ) {
     if( c == a[i] ) {
         // I've found a funny letter 
     }
 }

Die if nie wahr ergibt, egal, was ich in meinem String setzen.

Hier ist der komplettes Programm ich Code bin versucht.

War es hilfreich?

Lösung

Der Code sollte mit der richtigen Codierung kompiliert werden:

javac -encoding UTF-8 Foo.java

Es wird eine Codierung Mismatch da sein irgendwo.

public class Foo {
  char [] a = {'à', 'á', 'â', 'ä' };  
}

Der obige Code gespeichert als UTF-8 sollte der Hex-Dump werden:

70 75 62 6C 69 63 20 63 6C 61 73 73 20 46 6F 6F         public class Foo
20 7B 0D 0A 20 20 63 68 61 72 20 5B 5D 20 61 20          {__  char [] a
3D 20 7B 27 C3 A0 27 2C 20 27 C3 A1 27 2C 20 27         = {'__', '__', '
C3 A2 27 2C 20 27 C3 A4 27 20 7D 3B 20 20 0D 0A         __', '__' };  __
7D 0D 0A 0D 0A                                          }____

Der UTF-8-Wert für den Codepunkt U + 00E0 (a) ist C3 A0.

Der Code sollte mit der richtigen Codierung kompiliert werden:

javac -encoding UTF-8 Foo.java

Es gibt eine geringe Chance, dass ein durch die Kombination von Sequenz U dargestellt werden + 0061 U + 0300. Dies ist die NFD Form (I‘ noch nie in einem Texteditor gekommen, dass es als Standard für die Texteingabe verwendet). Wie Thorbjørn Ravn Andersen Punkte , ist es oft besser, immer verwenden \ uXXXX Escape-Sequenzen -. es ist weniger zweideutig

Sie müssen auch Ihr Eingabegerät überprüfen (Datei / console / etc.)

Als letztes Mittel können Sie Ihre chars als Hex-Dump System.out.format("%04x", (int) c); und versuchen, sie manuell Decodierung mit einem Charakter Inspektor , um herauszufinden, was sie sind.

Andere Tipps

Für Unicode-Zeichen zu arbeiten, müssen Sie sicher sein, dass javac es in der gleichen Codierung liest, wie es geschrieben wird.

Sie werden sich eine Menge Ärger sparen, indem nur die \ uXXXX Notation.

die Unicode-Zeichenwerte nachschlagen, und die Verwendung Literale der Form \uxxxx.

U + 00e ist ein mit einem Gravis, z.

char aacute = '\u00e1';

Die nächste Frage ist, wo die Zeichenfolge herkam. Sind Sie sicher, es diese Zeichen hat? Als Zeichen zusammengesetzt? Besser etwas heraus in hex drucken und einen Blick haben.

Sie könnten zu normalisieren müssen (in Java 1.6 oder mit icu4j).

Das scheint Arbeit für mich in einem Schnelltest:

static char [] a = {'à', 'á', 'â', 'ä' };


    public static boolean foundMatch(String s){

        boolean test = false;
        for(int i=0;i < a.length;i++){
            String t = String.valueOf(a[i]);
            test = s.contains(t);
            if (test) return true;
    }
        return test;
    }

Sie erwähnen nicht, was Sie erreichen müssen (dh, warum Sie akzentuierte Zeichen in einer Zeichenfolge finden), werde ich ahne, dass Sie mehr tun müssen, als nur zu überprüfen, ob es Zeichen in ein Geschenk akzentuiert Stück-Eingang. Auf dem Risiko erzählen Sie etwas, was Sie schon wissen:

  • Wenn Sie brauchen, um sie einer Textzeichenfolge, um herauszufiltern Ich empfehle Ihnen, verwenden Whitelisting statt schwarze Liste.
  • Wenn Sie brauchen, um sie zu sortieren alphabetisch unabhängig von Akzentuierung, Verwendung java.text.Collator anstelle eines Roll-your-own-System.
  • Wenn Sie die akzentuierte Zeichen durch ihre ‚Basis‘ Zeichen zu ersetzen, die Collator wieder Hilfe (die Zersetzung Sachen drin) sein sollte, aber ich habe das noch nie gemacht, so dass ich Ihnen nicht sagen, wie so genau das tun.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top