为什么Unicode属性测试的C#System.Char方法有两个重载?
在中,我们看到两种检查字符是否为符号的方法:为什么Unicode属性测试的C#System.Char方法有两个重载?,c#,unicode,char,C#,Unicode,Char,在中,我们看到两种检查字符是否为符号的方法: public static bool IsSymbol(string s, int index) public static bool IsSymbol(char c) 对于其他属性测试也是如此:IsLower、Isleter等 为什么会有这种重复?是否有任何理由宁愿使用Char.IsSymbol(s,idx)而不是Char.IsSymbol(s[idx])?在表面上,两种重载似乎功能相同,但是,深入到调用InternalGetUnicodeCat
public static bool IsSymbol(string s, int index)
public static bool IsSymbol(char c)
对于其他属性测试也是如此:IsLower、Isleter等
为什么会有这种重复?是否有任何理由宁愿使用
Char.IsSymbol(s,idx)
而不是Char.IsSymbol(s[idx])
?在表面上,两种重载似乎功能相同,但是,深入到调用InternalGetUnicodeCategory
会发现它们会导致调用不同的CharUnicodeInfo.GetUnicodeCateogry
重载
字符串int
重载在调用同一个char
函数之前,通过InternalConvertToUtf32
执行UTF32转换。这说明了对UTF16编码字符中的代理项对进行解码的可能性
internal static UnicodeCategory InternalGetUnicodeCategory(String value, int index) {
Contract.Assert(value != null, "value can not be null");
Contract.Assert(index < value.Length, "index < value.Length");
return (InternalGetUnicodeCategory(InternalConvertToUtf32(value, index)));
}
内部静态UnicodeCegory InternalGetUnicodeCegory(字符串值,int索引){
Assert(value!=null,“value不能为null”);
契约.断言(索引
你可能会问,这有什么关系?答案是.Net支持文本元素。微软表示:
文本元素是显示为单个字符的文本单元,称为图示符。文本元素可以是基本字符、代理项对或组合字符序列
虽然我不相信IsSymbol
函数及其相关函数可以解码图形或组合字符序列,但调用文本元素的原因是它们可以定义为代理对,因此需要通过IsSymbol()的字符串int
重载进行解码,IsLetter()
等
这意味着通过char
重载传递代理项对将返回错误的结果,因为字符串中的字符可能是代理项对。您不能假设16位编码表示单个字符,而在所述索引处传递字符串的字符将产生该假设
由于代理项对可以在.Net中的字符串中表示,因此,如果您处理的字符串可能包含其中一个,则IsSymbol(string s,int index)
重载将更合适,以覆盖其中一个对存在的情况
结果不同的一个具体例子是
string s=char.ConvertFromUtf32(128204);//“更好地处理utf16代理项对可能是采用字符串的一个原因。@RaphaelMiedl。它使用GetUnicodegory,它使用InternalGetUnicodegory,它使用InternalGetCategoryValue,它进行utf16到UTF32的转换,这可能导致代理项对的解码。@RaymondChen:如果你能把它变成answe的话。”r、 我认为这样做会很好。看起来拉斐尔是正确的:。文档应该描述这种行为。有趣的是,一个字符可以同时被分类为高级代理和字母。Unicode需要一个或两个字符来编码一个代码点。这在编写C代码时是一个非常正确的参数。它不是唯一的一个,有些语言是d设计人员早在C#出现并决定支持System.Char之前就发现utf16是有问题的。Char很弱,要求程序员使用字符串重载。就像每个C#程序员都不喜欢的语言一样,它不应该被命名为:)更新为更简洁和尖锐的答案…希望:)您确定Char.IsSymbol()这类操作是在组合字符序列上进行的?这更令人惊讶。根据前面的讨论,我希望它们只在代码点上进行操作(即仅解码代理项对)。我不确定组合序列的情况,但是文本元素被定义为代理项对或组合字符序列,所以我只是回答他们关于重载的潜在原因。看看他们是否也对序列进行操作会很有趣。@U fish Unicode字符属性只是定义而已因此,处理整个组合字符序列/字符集簇没有多大意义。另外,快速查看链接转换函数似乎可以确认它仅通过utf32转换使用代码点。这段引文似乎更多地介绍了C#中的通用unicode支持,而不是特定于IsSymbol()
函数。我同意。@Eval,如果您更新您的答案以反映这一点(即IsSymbol()
和friends解码代理项),并删除对图形和文本元素的讨论,我将接受您的答案。