Выделенные литералы в Java - PullRequest
       50

Выделенные литералы в Java

2 голосов
/ 21 декабря 2009

Я пытался набирать литералы символов для акцентированных гласных в Java, но компиляторы говорят что-то вроде: литерал закрытых символов

Вот что я пытаюсь сделать:

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

Я пытался использовать Unicode '\u00E0', но по какой-то причине они не совпадают с моим кодом:

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

if никогда не оценивается как истина, независимо от того, что я положил в мою строку.

Вот полная программа Я пытаюсь кодировать.

Ответы [ 5 ]

6 голосов
/ 22 декабря 2009

Код должен быть скомпилирован с правильной кодировкой:

javac -encoding UTF-8 Foo.java

Там будет где-то несоответствие кодировки.

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

Приведенный выше код, сохраненный как UTF-8, должен стать шестнадцатеричным дампом:

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

Значение UTF-8 для кодовой точки U + 00E0 (& # xE0;) равно C3 A0.

Код должен быть скомпилирован с правильной кодировкой:

javac -encoding UTF-8 Foo.java

Существует вероятность того, что & # x61; & # x300; будет представлен последовательностью объединения U + 0061 U + 0300. Это форма NFD (я никогда не сталкивался с текстовым редактором, который использовал его по умолчанию для ввода текста). Как указывает Турбьёрн Равн Андерсен , часто лучше всегда использовать escape-последовательности \ uXXXX - это менее двусмысленно.

Вам также необходимо проверить ваше устройство ввода (файл / консоль / и т. Д.)

В крайнем случае, вы можете сбросить свои char s в шестнадцатеричном формате System.out.format("%04x", (int) c); и попробовать вручную расшифровать их с помощью инспектора символов , чтобы выяснить, что они из себя представляют.

5 голосов
/ 21 декабря 2009

Для работы Unicode-глав вы должны быть уверены, что javac читает их в той же кодировке, что и написано.

Вы избавите себя от множества неприятностей, просто используя нотацию \ uXXXX.

1 голос
/ 21 декабря 2009

Вы не упоминаете, что вам нужно сделать (то есть, почему вам нужно найти акцентированные символы в строке), я рискну предположить, что вам нужно сделать больше, чем просто проверить, присутствуют ли акцентированные символы в часть ввода. О риске рассказать вам то, что вы уже знаете:

  • Если вам нужно отфильтровать их из текстовой строки, я рекомендую использовать белый список вместо черного списка.
  • Если вам нужно отсортировать их в алфавитном порядке, независимо от акцентуации, используйте java.text.Collator вместо системы «сворачивайте сами».
  • Если вам нужно заменить акцентированные символы на их «базовые» символы, Collator снова должен помочь (вещи разложения внутри него), но я не делал этого раньше, поэтому я не могу сказать вам, как именно это сделать.
1 голос
/ 21 декабря 2009

Это, похоже, сработало для меня в быстром тесте:

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;
    }
1 голос
/ 21 декабря 2009

Найдите значения символов Unicode и используйте литералы вида \uxxxx.

U + 00e - с серьезным акцентом, например,

char aacute = '\u00e1';

Следующий вопрос - откуда взялась ваша строка? Вы уверены, что у них есть эти персонажи? Как складываются персонажи? Лучше распечатайте их в шестнадцатеричном виде и посмотрите.

Может потребоваться нормализация (в Java 1.6 или с icu4j).

...