C# 本地化:如何将区域性信息映射到脚本名称或Unicode字符范围?

C# 本地化:如何将区域性信息映射到脚本名称或Unicode字符范围?,c#,localization,.net-2.0,globalization,culture,C#,Localization,.net 2.0,Globalization,Culture,我需要一些关于本地化的信息。我将.NET2.0与C#2.0结合使用,C#2.0处理大多数本地化相关问题。但是,我需要在一个特定屏幕上手动绘制与屏幕上当前区域性对应的字母表 这与Microsoft Outlook中的“联系人”屏幕类似(联系人下的“地址卡”视图或“详细地址卡”视图),因此它需要在右端的一列按钮中添加一个按钮,每个按钮对应一个字母表 我正试图模仿它,但我不想让用户选择脚本。如果现在的文化是汉语,我想画汉语字母表。当用户将区域性信息更改为英语时(以及当他重新启动应用程序时),我希望绘制

我需要一些关于本地化的信息。我将.NET2.0与C#2.0结合使用,C#2.0处理大多数本地化相关问题。但是,我需要在一个特定屏幕上手动绘制与屏幕上当前区域性对应的字母表

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

我正试图模仿它,但我不想让用户选择脚本。如果现在的文化是汉语,我想画汉语字母表。当用户将区域性信息更改为英语时(以及当他重新启动应用程序时),我希望绘制英语字母表。希望你理解我的疑问

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

换句话说,是否有方法确定与区域性对应的脚本名称?或者可以确定与区域性对应的Unicode字符值的范围吗?它们中的任何一个都允许我正确地渲染按钮上的字母

我们衷心感谢您对此提出的任何建议或指导。如果我的方法(或我试图实现的目标)存在根本性的错误,请也指出这一点。谢谢你抽出时间


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

中文有数千个字符,因此可能无法显示其字符集中的所有字符。汉语中没有“字母表”的本土概念,我也不认为汉语有像日语那样的音节


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

我完全同意麦克曼的观点。此外,给定的语言不一定使用脚本中的所有字母


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

在本机代码中,有getLocaleInfo()的LOCALE\u脚本(Vista及以上),它显示了语言环境需要的脚本。目前没有类似的.Net概念。

Proto,等等!有一个更精确的解决方案。它是非托管的,您可能需要P/Invoke

GetLocaleInfoW(MAKELCID(wLangId, SORT_DEFAULT), LOCALE_FONTSIGNATURE, wcBuf, MAXWCBUF);
这给了你一个结构。答案位于lsUsb字段:Unicode子集位字段中。胡扯!此结构的MS页为空。但请在MSDN副本中查找。这里有完整的文档:描述支持哪些脚本的一整套标志。是的,泰米尔有一面旗帜;-)


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

有趣的话题。虽然它可能无法回答您的问题,但它是一个很好的资源

正确答案可能很复杂,取决于你正在解决的确切问题。假设您的目标是只将特定语言中使用的字母显示在电话簿的各个部分(如Outlook中),那么以下问题很少:

  • 联系人姓名跨越多个脚本/语言的人
  • 2-字形字母(如塞尔维亚语中的“Lj”)。它是一个音素,尽管有两个Unicode符号,但始终被视为一个字母它在电话簿中有自己的部分(与“L”分开)
  • 无法列出的字形太多(如中文)
  • 非正统排序(例如,泰语——电话簿只能用辅音分隔,忽略元音)
  • 大写/小写的区别(对于支持它的语言,您可能只需要一个大小写——它以较小的方式分解为土耳其语的“i”)

请查看我下面的回复(日期:2008年11月14日),感谢您的评论,并提供了一些示例,让我更仔细地思考这个问题,dbkk。是的,我可能在这上面花的时间比我最初预期的要多。