Question

J'ai essayé de type char littéraux pour les voyelles accentuées en Java, mais les compilateurs dit quelque chose comme: caractère non fermé littéral

est ce que je suis en train de faire:

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

Je l'ai essayé d'utiliser Unicode '\u00E0' mais pour une raison quelconque, ils ne correspondent pas à mon code:

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

Le if évalue jamais vrai, peu importe ce que je mets dans ma chaîne.

Voici le programme complet je suis en train de code.

Était-ce utile?

La solution

Le code doit être compilé avec l'encodage correct:

javac -encoding UTF-8 Foo.java

Il y aura un décalage d'encodage là quelque part.

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

Le code ci-dessus enregistrée au format UTF-8 doit devenir le vidage hexadécimal:

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                                          }____

La valeur UTF-8 pour le point de code U + 00E0 (A) est C3 A0.

Le code doit être compilé avec l'encodage correct:

javac -encoding UTF-8 Foo.java

Il y a une petite chance QU'UN sera représentée par la séquence combinant U + 0061 U + 0300. Ceci est NFD forme (I » ai jamais rencontré un éditeur de texte qui l'a utilisé comme une valeur par défaut pour la saisie de texte). Comme Thorbjørn Ravn Andersen souligne sur, il est souvent préférable d'utiliser toujours \ uXXXX séquences d'échappement -. il est moins ambigu

Vous devez également vérifier votre périphérique d'entrée (fichier / console / etc.)

En dernier recours, vous pouvez vider votre chars comme System.out.format("%04x", (int) c); hexagonale et essayez de les décoder manuellement avec un inspecteur de caractère pour savoir ce qu'ils sont.

Autres conseils

Pour les caractères Unicode pour travailler, vous devez être certain que

javac lit dans le même encodage comme il est écrit.

Vous vous épargnerez beaucoup de problèmes en utilisant simplement la notation \ uXXXX.

Recherchez les valeurs de caractères Unicode, et littérales utilisation du formulaire \uxxxx.

U + 00f est un avec un accent grave, par exemple.

char aacute = '\u00e1';

La question suivante est où votre chaîne vient. Etes-vous sûr qu'il a ces personnages? Comme caractères composés? Mieux imprimer un peu dans six pans et un coup d'oeil.

Vous devrez peut-être normaliser (en Java 1.6 ou icu4j).

Cela semblait fonctionner pour moi dans un test rapide:

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

Vous ne mentionnez pas ce que vous devez accomplir (à savoir pourquoi vous avez besoin de trouver des caractères accentués dans une chaîne), je vais hasarder une hypothèse que vous devez faire plus que simplement vérifier s'il y a des caractères accentués présents dans un pièce d'entrée. Sur le risque de vous dire quelque chose que vous savez déjà:

  • Si vous avez besoin de les filtrer d'une chaîne de texte que je vous recommande d'utiliser la liste blanche au lieu de listes noires.
  • Si vous avez besoin de les trier par ordre alphabétique quel que soit l'accentuation, utilisez java.text.Collator au lieu d'un système à rouler propre.
  • Si vous devez remplacer les caractères accentués par leurs caractères « de base », le Collator devrait à nouveau être utile (la substance de décomposition à l'intérieur), mais je l'ai pas fait avant, donc je ne peux pas vous dire comment faire exactement.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top