1. Обзор
В этом руководстве мы начнем с краткого обзора некоторых общих типов категорий для каждой определенной кодовой точки Unicode или диапазона символов, чтобы понять разницу между буквами и алфавитными символами .
Далее мы рассмотрим методы isAlphabetic ()
и isLetter()
класса Character
в Java. Наконец, мы рассмотрим сходства и различия между этими методами.
2. Типы общих категорий символов Unicode
Набор символов Unicode (UCS) содержит 1 114 112 кодовых точек: от U+0000 до U+10FFFF. Символы и диапазоны кодовых точек сгруппированы по категориям.
Класс Character
предоставляет две перегруженные версии метода getType ()
, который возвращает значение, указывающее тип общей категории персонажа .
Посмотрим на сигнатуру первого метода:
public static int getType(char ch)
Этот метод не может обрабатывать дополнительные символы. Для обработки всех символов Юникода, включая дополнительные символы, класс символов Java предоставляет
перегруженный метод getType
со следующей сигнатурой:
public static int getType(int codePoint)
Далее давайте рассмотрим некоторые общие типы категорий.
2.1. ПРОПИСНАЯ БУКВА
Тип общей категории UPPERCASE_LETTER
представляет буквы верхнего регистра.
Когда мы вызываем метод getType
Character
# для буквы верхнего регистра, например, ' U
', метод возвращает значение 1, что эквивалентно значению перечисления UPPERCASE_LETTER
:
``
assertEquals(Character.UPPERCASE_LETTER, Character.getType('U'));
2.2. СТРОЧНАЯ БУКВА
Тип общей категории LOWERCASE_LETTER
связан со строчными буквами.
При вызове метода getType
Character
# для строчной буквы, например, ' u
', метод вернет значение 2, которое совпадает со значением перечисления LOWERCASE_LETTER
:
``
assertEquals(Character.LOWERCASE_LETTER, Character.getType('u'));
2.3. TITLECASE_LETTER
Затем общая категория TITLECASE_LETTER представляет символы регистра заголовков.
Некоторые символы выглядят как пары латинских букв. Когда мы вызываем метод getType
Character
# для таких символов Unicode, он возвращает значение 3, равное значению перечисления TITLECASE_LETTER
:
assertEquals(Character.TITLECASE_LETTER, Character.getType('\u01f2'));
Здесь символ Unicode ' \u01f2
' представляет собой латинскую заглавную букву ' D
', за которой следует маленькая буква ' Z
' с кароном.
2.4. MODIFIER_LETTER
Буква-модификатор в стандарте Unicode — это «буква или символ, обычно написанный рядом с другой буквой, которую он каким-то образом изменяет» .
Тип общей категории MODIFIER_LETTER
представляет такие буквы-модификаторы.
Например, буква модификатора small H
, ' ʰ
', при передаче в метод Character
# getType
возвращает значение 4, которое совпадает со значением перечисления MODIFIER_LETTER
:
assertEquals(Character.MODIFIER_LETTER, Character.getType('\u02b0'));
Символ Unicode ' \u020
' представляет маленькую букву H
модификатора .
2.5. OTHER_LETTER
Тип общей категории OTHER_LETTER
представляет собой идеограмму или букву в алфавите с уникальным регистром. Идеограмма — это графический символ, представляющий идею или понятие, независимое от какого-либо конкретного языка.
Уникальный алфавит имеет только один регистр для букв. Например, иврит — это система письма с уникальным регистром.
Давайте посмотрим на пример еврейской буквы Алеф, ' א
', когда мы передаем ее методу Character
# getType
, он возвращает значение 5, которое равно значению перечисления OTHER_LETTER
:
assertEquals(Character.OTHER_LETTER, Character.getType('\u05d0'));
Символ Unicode ' = 0
' представляет еврейскую букву Алеф.
2.6. LETTER_NUMBER
Наконец, категория LETTER_NUMBER
связана с цифрами, состоящими из букв или буквоподобных символов.
Например, римские цифры относятся к общей категории LETTER_NUMBER .
Когда мы вызываем метод getType
символа
# с римской цифрой пять, 'Ⅴ', он возвращает значение 10, равное значению перечисления LETTER_NUMBER
:
assertEquals(Character.LETTER_NUMBER, Character.getType('\u2164'));
Символ Unicode ' \u2164
' представляет собой римскую цифру пять.
Далее рассмотрим метод Character
# isAlphabetic
.
3. Номер символа
в алфавитном порядке
Во-первых, давайте посмотрим на сигнатуру метода isAlphabetic
:
public static boolean isAlphabetic(int codePoint)
Это принимает кодовую точку Unicode в качестве входного параметра и возвращает true
, если указанная кодовая точка Unicode является буквенной, и false
в противном случае .
Символ является буквенным, если его общий тип категории является одним из следующих:
ПРОПИСНАЯ БУКВА
СТРОЧНАЯ БУКВА
TITLECASE_LETTER
MODIFIER_LETTER
OTHER_LETTER
LETTER_NUMBER
Кроме того, символ является алфавитным, если он имеет дополнительное свойство Other_Alphabetic
`` , как определено в стандарте Unicode.
Давайте рассмотрим несколько примеров символов, которые являются алфавитами:
assertTrue(Character.isAlphabetic('A'));
assertTrue(Character.isAlphabetic('\u01f2'));
В приведенных выше примерах мы передаем UPPERCASE_LETTER
'A'
и TITLECASE_LETTER '\u01f2',
которые представляют латинскую заглавную букву ' D
', за которой следует маленькая ' Z
' с кароном, в метод isAlphabetic
, и он возвращает true.
4. Символ
# isLetter
Класс символов
Java предоставляет метод isLetter()
для определения, является ли указанный символ буквой. Посмотрим на сигнатуру метода:
public static boolean isLetter(char ch)
Он принимает символ в качестве входного параметра и возвращает true
, если указанный символ является буквой, и false
в противном случае .
Символ считается буквой, если его общий тип категории, предоставленный методом Character
# getType
, является одним из следующих:
ПРОПИСНАЯ БУКВА
СТРОЧНАЯ БУКВА
TITLECASE_LETTER
MODIFIER_LETTER
OTHER_LETTER
Однако этот метод не может обрабатывать дополнительные символы. Для обработки всех символов Юникода, включая дополнительные символы, класс символов Java предоставляет
перегруженную версию метода isLetter()
:
public static boolean isLetter(int codePoint)
Этот метод может обрабатывать все символы Unicode, поскольку он принимает кодовую точку Unicode в качестве входного параметра. Кроме того, он возвращает true
, если указанная кодовая точка Unicode является буквой, как мы определили ранее.
Давайте рассмотрим несколько примеров символов, которые являются буквами:
assertTrue(Character.isAlphabetic('a'));
assertTrue(Character.isAlphabetic('\u02b0'));
В приведенных выше примерах мы вводим LOWERCASE_LETTER 'a'
и MODIFIER_LETTER '\ u02b0',
которые представляют маленькую букву модификатора H
, в метод isLetter
, и он возвращает true.
5. Сравните и сопоставьте
Наконец, мы можем видеть, что все буквы являются буквами, но не все буквы являются буквами .
Другими словами, метод isAlphabetic
возвращает значение true
, если символ является буквой или имеет общую категорию LETTER_NUMBER
. Кроме того, он также возвращает true
, если у символа есть свойство Other_Alphabetic
, определенное стандартом Unicode.
Во-первых, давайте рассмотрим пример символа, который является как буквой, так и алфавитом — символом « a
»:
assertTrue(Character.isLetter('a'));
assertTrue(Character.isAlphabetic('a'));
Символ ' a
', переданный в качестве входного параметра как методу isLetter()
, так и методу isAlphabetic() , возвращает значение
true
.
Далее, давайте рассмотрим пример символа, который является алфавитом, но не буквой. В этом случае мы будем использовать символ Unicode ' \u2164
', который представляет римскую цифру пять:
assertFalse(Character.isLetter('\u2164'));
assertTrue(Character.isAlphabetic('\u2164'));
Символ Unicode ' \u2164
' при передаче в метод isLetter()
возвращает false. С другой стороны, при передаче в метод isAlphabetic()
он возвращает true
.
Конечно, для английского языка это различие не имеет значения. Поскольку все буквы английского языка относятся к категории алфавитов. С другой стороны, некоторые символы в других языках могут иметь отличия.
6. Заключение
В этой статье мы узнали о различных общих категориях кодовой точки Unicode. Кроме того, мы рассмотрели сходства и различия между методами isAlphabetic()
и isLetter()
.
Как всегда, все эти примеры кода доступны на GitHub .