Почему Apache Commons считает "१२३" числовым?
Согласно документации Apache Commons Lang для StringUtils.isNumeric()
, строка "'" является числовой.
Поскольку я полагал, что это может быть ошибкой в документации, я провел тесты, чтобы проверить утверждение. Я обнаружил, что, согласно Apache Commons, он числовой.
Почему эта строка числовая? Что представляют эти персонажи?
Ответы
Ответ 1
Потому что "CharSequence содержит только цифры Unicode" (цитируя вашу связанную документацию).
Все символы возвращают true для Character.isDigit
:
Некоторые диапазоны символов Unicode, содержащие цифры:
- '\ u0030' через '\ u0039', цифры ISO-LATIN-1 ('0' - '9')
- '\ u0660' через '\ u0669', цифры на арабском языке
- '\ u06F0' через '\ u06F9', расширенные цифры на арабском языке
- '\ u0966' через '\ u096F', цифры Деванагари
- '\ uFF10' через '\ uFF19', цифры полной ширины
Многие другие диапазоны символов также содержат цифры.
१२३
- цифры Деванагари:
Ответ 2
Символ १२३ такой же, как 123 для непальского языка или любого другого языка, использующего сценарий деванагари, такого как хинди, гуджарати и т.д., И, следовательно, является числом для Apache Commons.
Ответ 3
Вы можете использовать Character#getType
, чтобы проверить общую категорию символов:
System.out.println(Character.DECIMAL_DIGIT_NUMBER == Character.getType('१'));
Это напечатает true
, что является "доказательством", что "1" является цифровым числом.
Теперь рассмотрим значение unicode символа '1':
System.out.println(Integer.toHexString('१'));
// 967
Это число находится в диапазоне цифр Деванагари - это: \u0966
через \u096F
.
Также попробуйте:
Character.UnicodeBlock block = Character.UnicodeBlock.of('१');
System.out.println(block.toString());
// DEVANAGARI
Devanagari:
- абугида (альфа-алфавитный) алфавит Индии и Непала
"123" - это "123" (базовый латинский юникод).
Чтение:
Ответ 4
Если вы когда-нибудь захотите узнать, какие свойства имеет определенный "символ" (и их довольно много), перейдите непосредственно к источнику: Unicode.org. У них есть инструменты для исследований, которые могут показать вам все, что вы хотели бы знать.
-
Если вы хотите увидеть все свойства определенного символа, попробуйте следующее:
http://unicode.org/cldr/utility/character.jsp?a=1
или
http://unicode.org/cldr/utility/character.jsp?a=%E0%A5%A7
-
Если вы хотите увидеть все символы, классифицированные как "десятичные цифры" (т.е. с номерами от 0 до 9), попробуйте следующее:
http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:Numeric_Type=Decimal:]
(550 кодовых очков - в настоящее время/в Unicode 9.0)
-
Если вы хотите увидеть все символы, классифицированные как "десятичные разряды цифр" (т.е. фракции, обведенные кружком и т.д.), попробуйте следующее:
http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:Numeric_Type=Numeric:]
(836 кодовых точек - в настоящее время/в Unicode 9.0)
-
Если вы хотите увидеть все символы, классифицированные как "десятичные цифры" (то есть с номерами от 0 до 9), но только с помощью Unicode 6.0 (который использует .NET), попробуйте следующее:
http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:Numeric_Type=Decimal:]%26[:Age=6.0:]
(420 кодовых точек - и не должны меняться)
-
Если вы хотите увидеть все символы, классифицированные как "десятичные цифры" (то есть с номерами от 0 до 9), но только с помощью Unicode 6.0 (который использует .NET), и только в Base-Multilingual Plane/no Additional Characters (т.е. ничего выше точки кода 65535/U + 0xFFFF), попробуйте следующее:
http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:Numeric_Type=Decimal:]%26[:Age=6.0:]%26[:bmp=Yes:]
(350 кодовых очков - и не должны меняться)
СОХРАНИТЬ В РАЗНООБРАЗИИ: Консорциум Unicode создает спецификацию, а не программное обеспечение. Это означает, что каждый разработчик программного обеспечения может выполнять эту спецификацию настолько точно, насколько это возможно. Так же, как и HTML, JavaScript, CSS, SQL и т.д., Существуют различия между различными платформами, языками и т.д. Например, я обнаружил ошибку в Microsoft.NET Framework, в которой обведенные латинскими буквами A-Z
и A-Z
- Кодовые точки 0x24B6 - 0x24E9 - неправильно регистрируются как char.IsLetter = true
(отчет об ошибке здесь). И это приводит к неожиданному поведению в связанных функциях, например, при вызове метода TextInfo.ToTitleCase()
(отчет об ошибке здесь).
Ответ 5
Символы 123 'на самом деле получены на языке хинди (в основном, на санскритском языке, например, Devanagiri), которые представляют собой числовые значения, как:
1 представляют 1
2 представляют 2
и как мудрый