为什么 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.他们有研究工具,可以向您展示您想知道的大部分内容。
如果您想查看特定角色的所有属性,请尝试以下操作:
http://unicode.org/cldr/utility/character.jsp?a=१
或:
如果您想查看所有分类为 "decimal digits" 的字符(即数值为 0 到 9),请尝试以下操作:
http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:Numeric_Type=Decimal:]
( 550 个代码点 -- 当前/从 Unicode 9.0 开始)
如果您想查看所有分类为 "non-decimal digit numbers" 的字符(即分数、圆圈等),请尝试以下操作:
http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:Numeric_Type=Numeric:]
( 836 个代码点 -- 当前/从 Unicode 9.0 开始)
如果您想查看所有分类为 "decimal digits" 的字符(即数值为 0 到 9), 但仅限于 Unicode 6.0(其中 .NET使用),请尝试以下操作:
http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:Numeric_Type=Decimal:]%26[:Age=6.0:]
( 420 个代码点 -- 不应更改)
如果您想查看所有分类为 "decimal digits" 的字符(即数值为 0 到 9),但仅限于 Unicode 6.0(.NET 使用),并且仅在基本多语言平面/没有补充字符(即代码点 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
(bug report here). And that leads to unexpected behavior in related functionality, such as when calling the TextInfo.ToTitleCase()
method (bug report here).
根据 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.他们有研究工具,可以向您展示您想知道的大部分内容。
如果您想查看特定角色的所有属性,请尝试以下操作:
http://unicode.org/cldr/utility/character.jsp?a=१
或:
如果您想查看所有分类为 "decimal digits" 的字符(即数值为 0 到 9),请尝试以下操作:
http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:Numeric_Type=Decimal:]
( 550 个代码点 -- 当前/从 Unicode 9.0 开始)如果您想查看所有分类为 "non-decimal digit numbers" 的字符(即分数、圆圈等),请尝试以下操作:
http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:Numeric_Type=Numeric:]
( 836 个代码点 -- 当前/从 Unicode 9.0 开始)如果您想查看所有分类为 "decimal digits" 的字符(即数值为 0 到 9), 但仅限于 Unicode 6.0(其中 .NET使用),请尝试以下操作:
http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:Numeric_Type=Decimal:]%26[:Age=6.0:]
( 420 个代码点 -- 不应更改)如果您想查看所有分类为 "decimal digits" 的字符(即数值为 0 到 9),但仅限于 Unicode 6.0(.NET 使用),并且仅在基本多语言平面/没有补充字符(即代码点 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
(bug report here). And that leads to unexpected behavior in related functionality, such as when calling the TextInfo.ToTitleCase()
method (bug report here).