8

在 Unicode 的数字十进制类别中,定义了 460 个十进制字符(有关示例,请参见此)。不幸的是,无论其外观如何,我都找不到任何代表数字的字符。因此,目前大多数软件只能将西方阿拉伯数字字符理解为数字。因此,您不能在 MS Excel 中输入其他数字字符。

各种书写系统中的数字表

如果 Unicode 有(至少)10 个数字 0 到 9 的代码作为纯数字,而不是字形,我们几乎可以在所有正常使用中使用它们,并且主机环境可以根据用户的区域设置显示本地化的数字字形。当我们想要将数字字形用作字符串时,我们也可以使用 460 个十进制 Unicode 数字中的任何一个。

另一方面,如果我们接受当前字符 U+0030 到 u+0039 作为纯数字,那么我们需要十个新字符用于西方阿拉伯数字。这种实现似乎也更向后兼容。此外,字符 U+0030 到 U+0039 的名称不涉及任何特定数字的外观。

显然,我们可以在应用程序中对所有 460 个十进制数字字符进行硬编码,并在内部将它们视为数字,但我正在寻找更合适的解决方案。如果我们还考虑包括罗马数字和古波斯数字在内的 224+464 个其他 Unicode 数字字符(Nl 类别 + 无类别),问题就会变得更加复杂。

我们如何使用操作系统范围的解决方案来解决这个问题?

另请参阅Web 应用程序中的数字本地化

4

3 回答 3

6

我不确定您要问什么,但与特定问题最接近的问题似乎是,“在当前情况下,我们应该如何以用户可以看到其本地数字字形的方式处理数学应用程序中的数字?”

非常简单:编写自己的数学应用程序。它将具有其数据的模型,例如,整数或实数。它还将具有该数据的视图,例如,以用户知道如何阅读的符号表示数字的字符串。(这些术语指的是模型-视图-控制器架构。)在您自己的应用程序中,为您的视图编写代码,使用阿拉伯数字字符、孟加拉数字字符、中文数字字符或任何您想要的表示来显示数字。

正如 Esailija 所写,通用语言环境数据存储库 (CLDR)Unicode 国际类 (ICU) 库可以帮助您编写此应用程序。

你写,

无论其外观如何,我都找不到任何代表数字的字符。因此,目前大多数(或所有)软件只能将西方阿拉伯数字字符理解为数字。所以你不能在 MS Excel 中输入其他数字字符。

我认为这三个句子没有逻辑联系。

您无法在 Microsoft Excel 中输入其他数字字符的原因是,Microsoft 做出了一个商业决策,即如果 Excel 仅用西方数字表示数字,它就足够有用了,而且他们没有必要构建您寻求的多语言电子表格。

目前大多数(或所有)软件仅将西方阿拉伯数字字符理解为数字的原因是因为许多其他软件开发人员已做出与 Microsoft 相同的业务决策。这不是因为数字是如何以 Unicode 编码的。

您是正确的,Unicode 标准没有代表数字的字符,无论其外观如何。这是因为 Unicode 标准处理字符,使用一个非常详细的模型来说明什么是字符,什么不是字符。Unicode 标准(通常)不与其他抽象数据模型实体一起使用。

所以:去编写具有您想要的行为的数学应用程序。平台和 API 对您开放。Unicode 标准以及 CLDR 和 ICU 为您提供了工具。做大事!

您添加:

显然,我们可以在应用程序中对所有 460 个十进制数字字符进行硬编码,并在内部将它们视为数字,但我正在寻找更合适的解决方案......我们如何使用操作系统范围的解决方案来解决这个问题?

您宣布解决方案“合适”的标准是什么?对十进制数字字符进行硬编码,或者更具体地说,编写一组特定于语言的例程以将抽象数字数据类型转换为各种语言的文本表示,是我认为可行的唯一方法。“操作系统范围的解决方案”是指可以安装到操作系统中的解决方案,它会改变现有应用程序的行为吗?好吧,您可以对此抱有希望,但我认为它不会传递给当前的操作系统。

请注意,特定于语言的例程可能可以使用RuleBasedNumberFormatICU 类来实现。此类可以将抽象数字格式化为文本字符串,例如“(例如,25,3476 为“25,376”或“vingt-cinq mille trois cents soixante-seize”或“fünfundzwanzigtausenddreihundertsechsundsiebzig”)' . 人们可能可以使用此类编写代码,以使用您确定的 46 种语言数字集中的任何一种来格式化数字。但是,应用软件仍然需要结合 ICU 和数字格式代码。

更新:修改了我的答案以跟踪原始发帖人问题中的措辞变化。添加了对“操作系统范围解决方案”的呼吁的响应。修复了“模型-视图-控制器”中的维基百科链接。

更新:删除虚假单词“the”。

于 2012-12-19T02:01:21.787 回答
4

您可以在CLDR中找到编号系统。-id属性描述可以在数字的 bcp 文件中找到。编号系统是numericalgorithimic,在 - 属性中指定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 范围之外,并且数字可以从左到右出现在其他从右到左的周围文本中。

但是,假设您想尝试此操作,您将需要每个代码点的 theNumeric Type和 the Numeric Value;这些是规范属性,其值在 UnicodeData.txt 中列出。它们定义了代表数字的每个代码点的抽象值(请注意,数字不一定是数字)。获得抽象编号后,您需要执行相反的过程,将其转换为表示相同值的与语言环境相关的代码点序列。

于 2012-12-25T01:16:58.100 回答