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

Posted

技术标签:

【中文标题】本地化:如何将文化信息映射到脚本名称或 Unicode 字符范围?【英文标题】:Localization: How to map culture info to a script name or Unicode character range? 【发布时间】:2008-10-31 05:18:37 【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

请在下面查看我的回复(2008 年 11 月 14 日)【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

原型,等等!有一个更准确的解决方案。您可能需要 P/Invoke 来处理它。

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

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

HTH。

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

【讨论】:

【参考方案5】:

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

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

联系人姓名跨越多种文字/语言的人。 2 字形字母(例如塞尔维亚语中的“Lj”)。它是一个音素,尽管它有 2 个 Unicode 符号,但始终被视为单个字母。 '它会在电话簿中有自己的部分(与'L'分开)。 字形太多,无法列出(例如中文) 非正统排序(例如泰语 - 电话簿将仅由辅音分隔,忽略元音)。 区分大写/小写(假设您只需要一种支持它的语言的大小写 - 土耳其语“i”在较小的程度上分解)。

【讨论】:

感谢 cmets 并提供一些示例让我更加努力地思考这个问题,dbkk。是的,我可能需要花费比我最初预期更多的时间。

以上是关于本地化:如何将文化信息映射到脚本名称或 Unicode 字符范围?的主要内容,如果未能解决你的问题,请参考以下文章

VB.NET:从 LCID 获取本地语言名称

csharp 如何更改和打印文化信息。也称为.NET中的本地化。

csharp 如何更改和打印文化信息。也称为.NET中的本地化。

如何映射一个共享的文件夹为盘符? 如何将本地文件夹映射为硬盘盘符

在 spark 和 scala 中,如何将数据框转换或映射到特定列信息?

WIndowsServer ---------- 将本地文件映射到服务器