我该去哪里获取按类别分类的Unicode字符列表?

44
我刚开始学习Unicode,不确定基于我的ASCII背景需要学习多少内容,但我正在阅读C#规范中关于标识符的规则来确定在Azure Table中允许哪些字符(该规范直接基于C#规范)。
我在哪里可以找到以下类别的Unicode字符列表:
  • letter-character:Lu、Ll、Lt、Lm、Lo或Nl类别的Unicode字符
  • combining-character:Mn或Mc类别的Unicode字符
  • decimal-digit-character:Nd类别的Unicode字符
  • connecting-character:Pc类别的Unicode字符
  • formatting-character:Cf类别的Unicode字符

1
@Hans Passant,那个正则表达式只适用于表名,而不适用于在属性名称中使用的标识符,例如PartitionKey和RowKey。 - makerofthings7
6
@Hans:非常错误的评论。A-Za-z只覆盖了数千个可用字母中的52个Unicode字符。 - Timwi
@Timwi - 哦,我不知道那个。当然,我是引用了文档的内容。 - Hans Passant
2
@Hans:哪些文档?链接在哪里?C#语言规范明确指出:“Unicode字符属于Lu、Ll、Lt、Lm、Lo或Nl类;或表示Lu、Ll、Lt、Lm、Lo或Nl类字符的unicode-escape-sequence”(§2.4.2标识符)。MakerOfThings7甚至在问题中提供了链接。 - Timwi
@Timwi - OP 知道我的意思。对我来说足够好了。 - Hans Passant
Timwi:看起来@HansPassant误读了OP链接的文档,并误解了OP链接的Azure Table文档中的“表名”部分(确实限制为那些少数字符),认为这与问题有关。当然,这个问题不是关于表名的。 - ShreevatsaR
5个回答

46
您可以从官方Unicode数据文件UnicodeData.txt中以自动化方式检索此信息,该文件在以下位置发布: 这是一个每行带有分号分隔值的文件。第三列告诉您每个字符的字符类别。
优点是您可以获取每个字符的字符名称,因此您比仅查看字符本身更清楚地了解它是什么(例如,您是否知道什么是ბ?没错,那是格鲁吉亚语中的Ban。:-)

2
不错!我甚至可以像这样在每个类别中搜索字符“;Cf;”。 - makerofthings7
2
我从未想过Unicode会这么复杂。看来我还有很多要学习的。 - makerofthings7
这很奇怪。文本文件中说“#”符号属于“Sc”类别,MSDN也如此说明,但实际上它属于“OtherPunctuation”,即“Ps”。这是.NET 4.5.1的一个错误吗? - Marcus
@Timwi 好的,我可能有点误解,但我的调试器仍然显示#是Ps,而不是Po或任何其他类别。在“OtherPunctuation”这样一个如此庞大的组中拥有#似乎对于.net来说是一个错误。 - Marcus
1
@oliversmith 我链接的文件没有单独列出所有汉字,而是以范围形式列出:4E00;<CJK Ideograph, First>;Lo;0;L;;;;;N;;;;; / 9FEF;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;; - Timwi
显示剩余3条评论

38

5
那个网站无法正确解析UnicodeData.txt。它无法识别范围并且不理解Cn。因此,类别Co,Cs,Lo和Cn的计数是错误的。除此之外,这是一个很酷的网站。 - Yuvi Masory

16

当然可以使用LINQ:

var charInfo = Enumerable.Range(0, 0x110000)
                         .Where(x => x < 0x00d800 || x > 0x00dfff)
                         .Select(char.ConvertFromUtf32)
                         .GroupBy(s => char.GetUnicodeCategory(s, 0))
                         .ToDictionary(g => g.Key);

foreach (var ch in charInfo[UnicodeCategory.LowercaseLetter])
{
    Console.Write(ch);
}

你可以在MSDN上找到Unicode类别及其简称的列表,例如,“Ll”代表UnicodeCategory.LowercaseLetter


你是怎么知道要在代码中硬编码这些常量的?它们从哪里来的? - makerofthings7
2
@MakerOfThings7:根据Char.ConvertFromUtf32的文档,如果参数“不是从U+0到U+10FFFF范围内的有效的21位Unicode代码点,并且不包括从U+D800到U+DFFF的代理对范围”,它会抛出一个异常。 - dtb
Linq很有趣。+1,因为我将从中学到一些东西。此外,我认为不是所有的字符都能在“Console.write”中呈现出来。也许最好将这些代码输出到一个HTML页面中,以便IE进行渲染? - makerofthings7
@MakerOfThings7:是的,控制台可以显示的字符集非常有限。将字符写入HTML页面是个好主意。 - dtb
我相信 char.GetUnicodeCategory 给出了错误的结果。我觉得 U+0E33 应该给出 SpacingCombiningMark 的结果,但它返回了 “OtherLetter”。这对我来说似乎不太对。 - Gusdor
@Gusdor,Unicode标准表示该句子属于“OtherLetter”类型。你可能正在寻找“Grapheme Cluster Break”,但我不确定它是否在C#中可用。 - NetMage

2
ANTLR lexer中,你可以找到Unicode字符集(LU、LL、LT、LM和LO),它们以方便的范围格式表示。

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接