本地化:如何将文化信息映射到脚本名称或Unicode字符范围?

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

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

我试图模仿,但我不想让用户选择脚本。 如果说现在的文化,中文,我想画中文字母。 当用户将文化信息更改为英语(并且当他重新启动应用程序时)我想要绘制英文字母。 希望您了解我在这个查询中的位置。

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

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

对此有任何建议或指导是真的很感激。 如果我的方法(或我想要实现的目标)存在根本性的错误,请同时指出。 谢谢你的时间。

PS:我知道最简单的解决方案是将脚本名称配置为用户首选项的一部分,或显示用户可供选择的语言列表(Outlook 2007中的联系人)。 但我只是想看看我是否可以渲染对应于文化的字母表,而无需用户做任何事情。

在本机代码中,有GetLocaleInfoEx()(Vista及以上版本)的LOCALE_SSCRIPTS,它显示了区域设置所需的脚本。 目前,.Net没有类似的概念。

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

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

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

无论如何,我能想到的最接近的是CultureInfo.TextInfo.ANSICodePage – >只有少数几个ANSI代码页 。 您可以创建一个表(或switch()语句,无论如何),列出每个ANSI代码页的脚本。

Proto,等等! 有一个更准确的解决方案。 这是一个非管理的你可能需要P / Invoke。

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

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

HTH。

编辑:哎呀! 没见过Shawne的回答。 哇! 内部专家的回答! ;-)无论如何,您可能仍然对Vista之前兼容的答案感兴趣。

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

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

  • 拥有多个脚本/语言的联系人姓名的人。
  • 2字形字母(例如塞尔维亚语中的’Lj’)。 这是一个音素,虽然它有2个Unicode符号,但始终被视为单个字母。 ‘它将在电话簿中有自己的部分(与’L’分开)。
  • 要列出的字形太多(例如中文)
  • 非正统的排序(例如泰语 – 电话簿只能用辅音分开,忽略元音)。
  • 大写/小写的区别(大概你只需要一个支持它的语言的案例 – 它以较小的方式分解土耳其语’i’)。