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()告诉你,它仍然和字母表没有任何关系。印刷术和语言是弱相关的。