为什么 Apache Commons 认为“१२३”是数字?

Why does Apache Commons consider '१२३' numeric?

根据 Apache Commons Lang 的 StringUtils.isNumeric() 文档,字符串“१२३”是数字。

因为我认为这可能是文档中的错误,所以我 运行 测试以验证该声明。我发现根据 Apache Commons,它 数字。

为什么这个字符串是数字?这些字符代表什么?

符号 १२३ 与尼泊尔语或使用 Devanagari script 的任何其他语言(如印地语、古吉拉特语等)的 123 相同,并且是因此是 Apache Commons 的编号。

因为“CharSequence 仅包含 Unicode 数字”(引用您的 linked documentation)。

Character.isDigit 的所有字符 return 为真:

Some Unicode character ranges that contain digits:

  • '\u0030' through '\u0039', ISO-LATIN-1 digits ('0' through '9')
  • '\u0660' through '\u0669', Arabic-Indic digits
  • '\u06F0' through '\u06F9', Extended Arabic-Indic digits
  • '\u0966' through '\u096F', Devanagari digits
  • '\uFF10' through '\uFF19', Fullwidth digits

Many other character ranges contain digits as well.

१२३ 是梵文数字:

符号“१२३”实际上源自印地语(基本上源自梵语,即 Devanagiri),代表数值,如:

१代表1

२代表2

和聪明人一样

您可以使用Character#getType查看角色的一般类别:

System.out.println(Character.DECIMAL_DIGIT_NUMBER == Character.getType('१'));

这将打印 true,这是一个 "evidence" '१' 是一个 数字 .

现在让我们检查'१'字符的unicode值:

System.out.println(Integer.toHexString('१'));
// 967

此数字在 Devanagari digits 范围内 - 即:\u0966\u096F

也试试:

Character.UnicodeBlock block = Character.UnicodeBlock.of('१');
System.out.println(block.toString());
// DEVANAGARI

Devanagari 是:

is an abugida (alphasyllabary) alphabet of India and Nepal

“१२३”是“123”(基本拉丁语 unicode)。

阅读中:

如果您想知道某个特定的 "character" 具有哪些属性(并且有很多),请直接转到源代码:Unicode.org.他们有研究工具,可以向您展示您想知道的大部分内容。

牢记: Unicode 联盟制定规范,而非软件。这意味着每个软件供应商都有责任尽可能准确地实施规范。所以就像 HTML、JavaScript、CSS、SQL 等,不同平台、语言等之间存在差异。例如,我在 Microsoft 的 .NET Framework 中发现了一个错误,其中带圆圈的拉丁字母 A-Za-z——代码点 0x24B6 到 0x24E9——没有正确注册为 char.IsLetter = truebug report here). And that leads to unexpected behavior in related functionality, such as when calling the TextInfo.ToTitleCase() method (bug report here).