web-dev-qa-db-ja.com

Apache Commonsが「१२३」を数値と見なすのはなぜですか?

StringUtils.isNumeric() に関するApache Commons Langのドキュメントによると、文字列「१२३」は数値です。

これはドキュメントの間違いであると考えたため、テストを実行してステートメントを検証しました。 Apache Commonsによれば、それはis数値であることがわかりました。

なぜこの文字列は数値なのですか?それらのキャラクターは何を表していますか?

100
Hannes

その理由は、「CharSequenceにはUnicode数字のみが含まれている」ためです( リンクされたドキュメント を引用)。

Character.isDigit の場合、すべての文字がtrueを返します。

数字を含むいくつかのUnicode文字範囲:

  • 「\ u0030」から「\ u0039」、ISO-LATIN-1の数字(「0」から「9」)
  • 「\ u0660」から「\ u0669」、アラビア語-インド数字
  • '\ u06F0'〜 '\ u06F9'、拡張アラビア数字
  • 「\ u0966」から「\ u096F」、デーバナーガリー数字
  • 「\ uFF10」から「\ uFF19」、全角数字

他の多くの文字範囲にも数字が含まれています。

१२३はデーバナーガリー数字です:

196
Andy Turner

記号१२३は、ネパール語、または Devanagariスクリプト を使用するその他の言語(ヒンディー語、グジャラート語など)の123と同じです。などであり、Apache Commonsの番号です。

Character#getType を使用して、キャラクターの一般的なカテゴリを確認できます。

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

これはtrueを出力します。これは、「१」が数字であるという「証拠」です。

次に、「१」文字のUnicode値を調べてみましょう。

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

この番号は、 デーバナーガリー数字 -の範囲にあります:\u0966から\u096F

また試してみてください:

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

デーバナーガリー は:

インドとネパールのアブギダ(アルファベット)です。

「१२३」は「123」(基本的なラテン語のユニコード)です。

読書:

27
Maroun

特定の「キャラクター」がどのプロパティを持っているかを知りたい場合(そして非常に多くあります)、ソースに直接アクセスしてください:Unicode.org 。彼らはあなたが知りたいことのほとんどをあなたに示すことができる研究ツールを持っています。

KEEP IN MIND:Unicode Consortiumは、ソフトウェアではなく仕様を作成します。つまり、仕様をできる限り正確に実装するのは各ソフトウェアベンダー次第です。そのため、HTML、JavaScript、CSS、SQLなどと同様に、プラットフォーム、言語などの違いがあります。たとえば、Microsoftの.NET Frameworkで、丸付きのラテン文字A-Zおよびa-z-0x24B6から0x24E9までのコードポイント-char.IsLetter = true(- バグレポートはこちら )。そして、それは、TextInfo.ToTitleCase()メソッドを呼び出すときなど、関連する機能で予期しない動作を引き起こします( バグレポートはこちら )。

24
Solomon Rutzky

記号「१२३」は、実際にはヒンディー語(基本的にはサンスクリット語、つまりDevanagiri)から派生したもので、次のような数値を表します。

१は1を表します

२は2を表します

そして賢明なように

20
Nayan Katkani