【发布时间】:2016-10-09 05:10:40
【问题描述】:
在methods of System.Char 中,我们看到了两种检查字符是否为符号的方法:
public static bool IsSymbol(string s, int index)
public static bool IsSymbol(char c)
对于其他属性测试也是如此:IsLower、IsLetter 等。
为什么会有这种重复?有什么理由更喜欢Char.IsSymbol(s, idx) 而不是Char.IsSymbol(s[idx])?
【问题讨论】:
-
更好地处理 utf16 代理对可能是采用我想象的字符串的一个可能原因。
-
@RaphaelMiedl Yup, that's it。它使用 GetUnicodeCategory,它使用 InternalGetUnicodeCategory,它使用 InternalGetCategoryValue,它执行 UTF16 到 UTF32 的转换,这可能导致代理对的解码。
-
@RaymondChen:如果你能回答这个问题,我认为会很好。
-
看起来 Raphael 是正确的:dotnetfiddle.net/JFMrey。文档应该描述这种行为。一个字符既可以归类为高代理,也可以归类为字母,这也很有趣。
-
Unicode 需要一个或两个字符来编码一个代码点,当您编写 C# 代码时这是一个非常正确的参数。它不是唯一的,一些语言设计人员在 C# 出现之前很久就发现 utf16 存在问题,并决定弱支持 System.Char,要求程序员使用字符串重载。就像每个 C# 程序员都喜欢不喜欢的语言一样,它不应该被命名:)