Почему Apache Commons считает "१२३" числовым? - программирование
Подтвердить что ты не робот

Почему Apache Commons считает "१२३" числовым?

Согласно документации Apache Commons Lang для StringUtils.isNumeric(), строка "'" является числовой.

Поскольку я полагал, что это может быть ошибкой в документации, я провел тесты, чтобы проверить утверждение. Я обнаружил, что, согласно Apache Commons, он числовой.

Почему эта строка числовая? Что представляют эти персонажи?

4b9b3361

Ответ 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. У них есть инструменты для исследований, которые могут показать вам все, что вы хотели бы знать.

СОХРАНИТЬ В РАЗНООБРАЗИИ: Консорциум 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

и как мудрый