关于Java:为什么???是数字?

Why is '???' numeric?

根据文档,字符串'???是数字的。

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

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


因为"charsequence只包含unicode数字"(引用链接文档)。

对于Character.isDigit,所有字符都返回true:

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.

???是天成文书(梵文)数字:

  • ?是天成文书(梵文)数字一,\u0967
  • ?是天成文书(梵文)数字2,\u0968
  • ?是天成文书(梵文)数字三,\u0969


符号????对于尼泊尔语言或使用天成文书(梵文)脚本(如印地语、古吉拉特语等)的任何其他语言,与123相同,因此是Apache Commons的数字。


您可以使用Character#getType检查角色的常规类别:

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

这将打印true,这是一个"证据",表明'?'是一个数字。

现在,让我们检查"?"的Unicode值。特点:

1
2
System.out.println(Integer.toHexString('?'));
// 967

这个数字在天成文书(梵文)数字的范围内,即:\u0966\u096F

也尝试:

1
2
3
Character.UnicodeBlock block = Character.UnicodeBlock.of('?');
System.out.println(block.toString());
// DEVANAGARI

Devanagari是:

is an abugida (alphasyllabary) alphabet of India and Nepal

"???"是"123"(基本拉丁Unicode)。

阅读:

  • 有关"?"的详细信息性格
  • StringUtils#isNumeric实施


如果您想知道某个特定的"字符"具有哪些属性(并且有很多属性),请直接转到源代码:unicode.org。他们有研究工具,可以向你展示你最想知道的一切。

  • 如果要查看特定字符的所有属性,请尝试以下操作:

    http://unicode.org/cldr/utility/character.jsp?A =?

    或:

    http://unicode.org/cldr/utility/character.jsp?A= %E0%A5%A7

  • 如果要查看所有分类为"十进制数字"的字符(即数值为0到9的字符),请尝试以下操作:

    http://unicode.org/cldr/utility/list-unicodeset.jsp?A=[:数值_类型=小数:](550个代码点--目前/从Unicode 9.0开始)

  • 如果要查看所有分类为"非十进制数字"(即分数、带圆圈等)的字符,请尝试以下操作:

    http://unicode.org/cldr/utility/list-unicodeset.jsp?A=[:数字类型=数字:](836个码位--目前/从Unicode 9.0开始)

  • 如果要查看所有分类为"十进制数字"的字符(即数值为0到9的字符),但只能从unicode 6.0向上(使用.net),请尝试以下操作:

    http://unicode.org/cldr/utility/list-unicodeset.jsp?A=[:数值_类型=小数:]%26[:年龄=6.0:](420个代码点--不应该更改)

  • 如果要查看分类为"十进制数字"的所有字符(即,数值为0到9的字符),但只能向上到Unicode 6.0(这是.NET使用的字符),并且只能在基本多语言平面/没有补充字符(即,代码点65535/U+0xffff以上的字符),请尝试以下操作:

    http://unicode.org/cldr/utility/list-unicodeset.jsp?A=[:数值_type=decimal:]%26[:age=6.0:]%26[:bmp=yes:](350个代码点--不应该更改)

请记住:Unicode联合体生成的是规范,而不是软件。这意味着每个软件供应商都要尽可能准确地实现规范。因此,就像HTML、javascript、CSS、SQL等,不同的平台、语言等之间存在差异。例如,我在Microsoft的.NET框架中发现了一个bug,在该框架中,用拉丁文圈起来的A-ZA-Z--代码点0x24b6到0x24e9--不能正确注册为char.IsLetter = true(此处是bug报告)。这会导致相关功能中出现意外行为,例如调用TextInfo.ToTitleCase()方法时(此处为bug报告)。


符号???实际上源自印地语(基本上来自梵文语言,即天成文书),它表示数字值,如:

?代表1

?代表2

像智慧一样