2

我需要一些关于本地化的信息。我正在使用带有 C# 2.0 的 .net 2.0,它处理了大部分与本地化相关的问题。但是,我需要在一个特定的屏幕上手动绘制与当前文化相对应的字母表。

这类似于 Microsoft Outlook 中的联系人屏幕(联系人下的地址卡视图或详细地址卡视图),因此它需要在右端有一列按钮,每个字母一个。

我试图模仿这一点,但我不想让用户选择脚本。如果说现在的文化是中文,我想画中文字母。当用户将文化信息更改为英语时(以及当他重新启动应用程序时),我想改为绘制英文字母。希望您了解我将使用此查询的去向。

我可以确定当前用户的文化(Application.CurrentCulture 或 System.Globalization.CultureInfo.CurrentCulture 会给出文化相关的信息)。我也有所有的脚本来呈现字母。但是,问题是我不知道如何将文化信息映射到脚本的名称。

换句话说,有没有办法确定与文化对应的脚本名称?或者是否可以确定与文化对应的 Unicode 字符值的范围?它们中的任何一个都可以让我正确呈现按钮上的字母。

对此的任何建议或指导都非常感谢。如果我的方法(或我试图实现的目标)存在根本性错误,请同时指出。谢谢你的时间。

PS:我知道最简单的解决方案是将脚本名称配置为用户首选项的一部分,或者显示语言列表供用户选择(如 Outlook 2007 中的联系人)。但我只是想看看我是否可以在用户不必做任何事情的情况下呈现与文化相对应的字母表。

4

5 回答 5

1

在本机代码中,GetLocaleInfoEx()(Vista 及更高版本)的 LOCALE_SSCRIPTS 向您显示语言环境需要哪些脚本。.Net 目前还没有类似的概念。

于 2008-11-03T18:46:03.353 回答
0

中文有数千个字符,因此显示其字符集中的所有字符可能不可行。中文中没有“字母”的原生概念,我认为中文没有像日语那样的音节。

拼音(用罗马字母书写的中文)可用于表示汉字,这可能有助于您对它们进行索引。我知道这不能回答你的问题,但我希望它会有所帮助。

于 2008-10-31T13:47:14.190 回答
0

我完全同意mikiemacman。此外,给定的语言不一定使用脚本的所有字母。

无论如何,我能想到的最接近的是 CultureInfo.TextInfo.ANSICodePage -> There are only a few of ANSI code pages。您可以创建一个列出每个 ANSI 代码页的脚本的表(或 switch() 语句,等等)。

于 2008-10-31T20:09:28.613 回答
0

原型,等等!有一个更准确的解决方案。这是您可能不得不 P/Invoke 的非托管。

GetLocaleInfoW(MAKELCID(wLangId, SORT_DEFAULT), LOCALE_FONTSIGNATURE, wcBuf, MAXWCBUF);

这为您提供了一个LOCALESIGNATURE结构。答案在 lsUsb 字段中:Unicode 子集位字段。老鼠!此结构的 MS 页为空。但是在您的 MSDN 副本中查找它。那里有完整的记录:一整套描述支持哪些脚本的标志。是的,泰米尔语有一面旗帜;-)

HTH。

编辑:哎呀!没有看到肖恩的回答。哇!来自内部专家的回答!;-) 无论如何,您可能仍然对 Pre-Vista 兼容的答案感兴趣。

于 2008-11-05T15:59:11.673 回答
0

引人入胜的话题。虽然它可能无法回答您的问题,但Omniglot是一个很好的资源。

正确答案可能很复杂,并且取决于您要解决的确切问题。假设您的目标仅显示以特定语言使用的字母来分隔电话簿部分(如在 Outlook 中),则很少有问题是:

  • 联系人姓名跨越多种文字/语言的人。
  • 2 个字形字母(例如塞尔维亚语中的“Lj”)。它是一个音素,尽管它有 2 个 Unicode 符号,但始终被视为单个字母。'它将在电话簿中有自己的部分(与'L'分开)。
  • 字形太多无法列出(例如中文)
  • 非正统排序(例如泰语——电话簿将仅由辅音分隔,忽略元音)。
  • 大写/小写的区别(大概你只想要一种支持它的语言的大小写——它在土耳其语的“i”中以较小的方式分解)。
于 2008-11-24T20:29:55.047 回答