8

Unicodeの数値の10 進数カテゴリでは、460 個の 10 進文字が定義されています (いくつかの例については、このページを参照してください)。残念ながら、見た目にかかわらず、数字を表す文字は見つかりませんでした。その結果、現在、ほとんどのソフトウェアで数字として認識されるのは西アラビア数字のみです。たとえば、MS Excel で他の数字を入力することはできません。

さまざまな書記体系の数字の表

Unicode が (少なくとも) 数字 0 から 9 の 10 個のコードをグリフではなく純粋な数字として持つ場合、ほとんどすべての通常の使用法でそれらを使用でき、ホスト環境はユーザーのロケールに従ってローカライズされた数字グリフを表示できます。また、数値グリフを文字列として扱いたい場合は、460 の 10 進 Unicode 数値のいずれかを使用できます。

一方、現在の文字 U+0030 から u+0039 を純粋な数字として受け入れると、西アラビア数字用に 10 個の新しい文字が必要になります。この実装は、下位互換性も高いようです。また、U+0030 から U+0039 までの文字の名前は、特定の数字の外観を参照していません。

明らかに、460 個の 10 進数の数字すべてをアプリにハードコーディングし、内部的にそれらを数値として扱うことができますが、より適切な解決策を探しています。ローマ数字と旧ペルシャ数字を含む 224+464 個の他の Unicode 数字文字 (Nl カテゴリ + カテゴリなし) も考慮すると、問題はさらに複雑になります。

OS全体のソリューションでこの問題をどのように解決できますか?

Web アプリケーションでの Numbers のローカリゼーションも参照してください。

4

3 に答える 3

6

何を質問しているのか正確にはわかりませんが、特定の質問に最も近いのは、「現在の状況では、ユーザーがローカルの数字のグリフを表示できるように、数学アプリケーションで数字をどのように処理する必要があるか」ということです。

非常に簡単です。独自の数学アプリケーションを作成します。たとえば、整数や実数などのデータのモデルがあります。また、そのデータのビューもあります。たとえば、ユーザーが読み方を知っている表記法で数値を表す文字列があります。(これらの用語は、Model-View-Controllerアーキテクチャーを指します。)独自のアプリケーションで、アラビア数字、ベンガル数字、中国語の数字、または任意の表現を使用して数値を表示するビューのコードを記述します。

Esailijaが書いているように、Common Locale Data Repository(CLDR)およびInternational Classes for Unicode(ICU)ライブラリは、このアプリケーションの作成に役立ちます。

あなたが書く、

見た目に関わらず、数字を表す文字は見つかりませんでした。その結果、現在、ほとんどの(またはおそらくすべての)ソフトウェアで数字として認識されるのは、西アラビア数字のみです。そのため、MSExcelで他の数字を入力することはできません。

これらの3つの文には論理的なつながりがないと思います。

Microsoft Excelで他の数字を入力できない理由は、Excelが西洋数字のみで数字を表す場合は十分に有用であり、必要な多言語スプレッドシートを作成する必要がないというビジネス上の決定を下したためです。

現在、ほとんどの(またはおそらくすべての)ソフトウェアで数字として理解されているのは西アラビア数字のみである理由は、他の多くのソフトウェア開発者がMicrosoftと同じビジネス上の決定を下したためです。これは、Unicodeで数字がどのようにエンコードされているかによるものではありません。

Unicode標準には、その外観に関係なく、数字を表す文字がないことは正しいです。これは、Unicode標準が文字を処理し、文字とは何かの非常に詳細なモデルを使用しているためです。Unicode標準(通常)は、他の抽象データモデルエンティティには含まれていません。

だから:あなたが望む振る舞いをする数学的なアプリケーションを書いてください。プラットフォームとAPIはあなたに開かれています。Unicode標準とCLDRおよびICUは、ツールを提供します。素晴らしいことをしてください!

あなたが追加します:

もちろん、アプリ内の460個の10進数すべてをハードコーディングして、内部で数字として扱うことはできますが、より適切な解決策を探しています。OS全体の解決策でこの問題をどのように解決できますか?

ソリューションを「適切」と宣言するための基準は何ですか?10進数の文字をハードコーディングするか、より具体的には、抽象的な数値データ型をさまざまな言語のテキスト表現に変換するための言語固有のルーチンのセットを作成することが、機能する唯一の方法です。「OS全体のソリューション」とは、OSにインストールできるソリューションを意味し、既存のアプリケーションの動作を変更しますか?まあ、それは期待できますが、現在のOSでは実現しないと思います。

言語固有のルーチンは、おそらくRuleBasedNumberFormatICUのクラスで実装できることに注意してください。このクラスは、抽象的な数値を「(たとえば、25,3476を「25,376」または「vingt-cinqmille trois cents soixante-seize」または「fünfundzwanzigtausenddreihundertsechsundsiebzig」)」のようなテキストの文字列としてフォーマットできます。 。おそらく、このクラスでコードを記述して、識別した46の言語セットの数字のいずれかを使用して数値をフォーマットすることができます。ただし、アプリケーションソフトウェアには、ICUと数値形式コードを組み込む必要があります。

更新:元の投稿者の質問の文言の変更を追跡するように私の回答を変更しました。「OSワイドソリューション」を求める応答を追加しました。「Model-view-controller」のウィキペディアへのリンクを修正しました。

更新:偽の単語「the」を削除しました。

于 2012-12-19T02:01:21.787 に答える
4

番号付けシステムはCLDRにあります。id-attributeの説明は、番号の bcp ファイルにあります。番号付けシステムは、numericまたは-attributealgorithimicで指定されます。typeの場合"numeric"digits属性には 0 から始まるシステムの数字が含まれます。 の場合"algorithmic"rules-attribute は使用される規則を参照します。ナンバリング システム ファイルの読み取り

番号付けシステムのアルゴリズム規則については、rbnf (規則に基づいた数値形式) フォルダーの root.xml ファイルを参照してください。rbnf ファイルの読み取りに関する詳細

ICU ライブラリは既にこれを実装していますが、上記のリンクのデータに基づいて独自のものを展開し、任意の番号付けシステム文字から整数に、またはその逆に変換することもできます。

于 2012-12-16T10:36:59.013 に答える
1

Unicode は、文字のグリフを規定していません。文字は、特定の形状とは関係なく、抽象化されたものと見なされます。だから、ある意味では、すべてのキャラクターは「外見に関係なく」です。

しかし、あなたの質問にたどり着くには (私が思うに)、この方法でローカリゼーションを実行するには、数値を表す一連のコード ポイントを最初に識別して実際の数値に変換する必要があります。これを行う方法をカバーしている Unicode の出版物はないと思います ( UTR 25でさえラテン数字を想定しています)。また、必ずしも簡単であるとは限りません。たとえば、前述のように、一部のコード ポイントは 0 ~ 9 の範囲外の値を持ち、数字は左から右に表示され、それ以外の場合は右から左の周囲のテキストに表示されます。

ただし、これを試みると仮定すると、各コード ポイントのNumeric Typeとが必要になります。Numeric Valueこれらは、値が UnicodeData.txt にリストされている規範的なプロパティです。それらは、数値を表す各コードポイントの抽象値を定義します(数値は必ずしも数字ではないことに注意してください)。抽象番号を取得したら、逆のプロセスを実行して、同じ値を表すロケール依存のコード ポイントのシーケンスに変換する必要があります。

于 2012-12-25T01:16:58.100 に答える