C# 检索当前区域性的所有大写字母

C# 检索当前区域性的所有大写字母,c#,.net,cultureinfo,C#,.net,Cultureinfo,我知道有CultureInfo.TextInfo.ToUpper(),但是,有没有办法检索给定区域性的所有大写字母的集合 请注意,我只想获取当前语言字母表中的所有大写字母。例如,对于en-US我想得到列表A,B,C,…Y,Z(顺序实际上并不重要)。在.NET中没有内置数据库来跟踪特定语言字母表中出现的字母。这将是一个非常大的。一个有争议的问题是,即使是像荷兰语这样拥有简单字母表的国家,说话者也不同意Ÿ有向图是否在字母表中以及它出现在什么位置。前南斯拉夫有两个字母表,战争已经为之而战。瑞典人不久前

我知道有
CultureInfo.TextInfo.ToUpper()
,但是,有没有办法检索给定区域性的所有大写字母的集合


请注意,我只想获取当前语言字母表中的所有大写字母。例如,对于
en-US
我想得到列表
A,B,C,…Y,Z
(顺序实际上并不重要)。

在.NET中没有内置数据库来跟踪特定语言字母表中出现的字母。这将是一个非常大的。一个有争议的问题是,即使是像荷兰语这样拥有简单字母表的国家,说话者也不同意Ÿ有向图是否在字母表中以及它出现在什么位置。前南斯拉夫有两个字母表,战争已经为之而战。瑞典人不久前在万维网的逼迫下补充道,这是一个多变的世界。对于像汉语和韩语这样的语言来说,这是一个相当不现实的问题


您不希望必须在一般情况下解决此问题。

根据您对大写字母的实际定义,有很多大写字母,只是在不变的区域性中,更不用说其他大写字母了,并且根据您的操作系统而有所不同

根据我的定义,此LinqPad查询列出了973(在Win8.1上,Vista上为873,XP上为673)个大写字符,即字符不变为
ToUpperInvariant
,而不不变为
ToLowerInvariant

var UppercaseChars = from i in Enumerable.Range(0, 65536)
                    let c = (char)i
                    let u = Char.ToUpperInvariant(c)
                    let l = Char.ToLowerInvariant(c)
                    where c == u && u != l
                    select c;
UppercaseChars.Count().Dump();
String.Join(" ", UppercaseChars).Dump();

显然,您可以将其更改为使用
CultureInfo.TextInfo.ToUpper
.ToLower
来获取任何可用区域性的列表


请注意,我对大写字母的“定义”遗漏了33个字符(在Win8.1上,Vista上为135,XP上为306),这些字符被Unicode类别称为大写,但没有小写替代字符(根据
ToLowerInvariant
)。但是,它还包括69个字符(在Win8.1上为71个,在Vista上为71个,在XP上为42个),这些字符未被Unicode类别定义为大写字母,但仍有小写替代字符(同样根据
ToLowerInvariant
)。后者是Unicode类别TitlecaseLetter(不在XP中)、LetterNumber和OtherSymbol中的一些字符。Vista实际上包含Unicode类别LowercaseLetter中的4个字符(ῃ ῳ ⱥ ⱦ).

实际回答您的问题以及您在评论中的问题:根据Unicode类别“database”获取大写字符的位置是通过
Char.getUnicodeCegory
。实际的数据库不能以任何其他有用的方式公开访问

作为参考,您可以看到前255个条目;其余条目将加载并查找


请记住,正如我在另一个回答中提到的,您对大写字母的定义可能不同于Unicode。

谢谢,但是
ToUpper()是如何定义的呢
如果小写->大写字符之间没有映射,则在内部工作?这与字母表无关。它会想出一些方法,试图遵循Unicode大小写映射规则。但这并不完美,例如,“fi”。ToUpper()无法正常工作。详细信息,详细信息。这也是正则表达式仅提供
[A-Z]
而且没有真正的“全大写字母”字符类?嗯,regex是在美国发明的。如果它是中国发明的话,它看起来可能会有很大的不同:).NET regex实际上有一个类,
\p{Lu}
.Char.getUnicodegory()告诉你,它仍然和字母表没有任何关系。印刷术和语言是弱相关的。