Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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 (à) равно C3 A0.

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

javac -encoding UTF-8 Foo.java

Существует внешняя вероятность, что à будет представлено комбинирующей последовательностью U+0061 U+0300.Это НФД (я никогда не встречал текстового редактора, который бы использовал его по умолчанию для ввода текста).Как Турбьёрн Равн Андерсен очки out, зачастую лучше всегда использовать escape-последовательности \uXXXX — это менее двусмысленно.

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

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

Другие советы

Чтобы символы Юникода работали, вы должны быть уверены, что javac читает их в той же кодировке, в которой они записаны.

Вы избавите себя от многих проблем, просто используя обозначение \uXXXX.

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

U+00e — это буква с серьезным акцентом, например.

char aacute = '\u00e1';

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

Возможно, вам потребуется нормализовать (в Java 1.6 или с помощью icu4j).

Кажется, это сработало для меня в быстром тесте:

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

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

  • Если вам нужно отфильтровать их из текстовой строки, я рекомендую использовать белый список вместо черного списка.
  • Если вам нужно отсортировать их по алфавиту независимо от акцентуации, используйте java.text.Коллектор вместо системы «сделай сам».
  • Если вам нужно заменить акцентированные символы их «базовыми» символами, подборщик снова должно помочь (материал о разложении внутри него), но я не делал этого раньше, поэтому не могу точно сказать вам, как это сделать.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top