public static bool IsSymbol(string s,int index) public static bool IsSymbol(char c)
同样为其他财产测试:IsLower,IsLetter等
为什么会出现这种重复?有什么理由喜欢Char.IsSymbol(s,idx)超过Char.IsSymbol(s [idx])?
解决方法
在调用同一个单独的内部GetGetUnicodeCategory函数之前,通过InternalConvertToUtf32,字符串int过载最终通过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))); }
Check out the Conversion implementation here if you want.
为什么这件事你可能会问?那么答案是.Net支持文本元素.微软说:
MSDN Documentation on Unicode Support for Surrogate Pairs
A text element is a unit of text that is displayed as a single character,called a grapheme. A text element can be a base character,a surrogate pair,or a combining character sequence.
虽然我不相信IsSymbol函数及其亲属可以解码格式化或组合字符序列,但是将文本元素标注的原因在于它们可以被定义为代理对,因此需要通过字符串进行解码,int重载IsSymbol(),IsLetter()等…
这意味着通过char重载传递代理对会返回错误的结果,因为字符串中的字符可能是代理对.你不能假设一个16位编码代表单个字符,并且在该索引处传递字符串的字符将会做出这样的假设.
因为代理对可以在.Net中的字符串中表示,所以如果你正在处理可能包含其中的一个的字符串,则IsSymbol(string s,int index)重载将更适合于覆盖这些对中的一个存在的情况.
结果不同的具体示例是
string s = char.ConvertFromUtf32(128204); // "原文地址:https://www.jb51.cc/c/114885.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。