Акцентированные литералы в Java
Вопрос
Я пытался вводить символьные литералы для ударенных гласных в 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 — это менее двусмысленно.
Вам также необходимо проверить ваше устройство ввода (файл/консоль/и т. д.)
В крайнем случае, вы можете сбросить свой char
s как шестнадцатеричный 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.Коллектор вместо системы «сделай сам».
- Если вам нужно заменить акцентированные символы их «базовыми» символами, подборщик снова должно помочь (материал о разложении внутри него), но я не делал этого раньше, поэтому не могу точно сказать вам, как это сделать.