UTF-8无代理对,为何char.GetUnicodeCategory返回Surrogate?
为什么输出“Surrogate”?
- 首先得明确:UTF-8确实没有代理对的概念,但C#里的
string类型本质是用UTF-16编码存储字符的。 - 你用的😀对应的Unicode码位是
U+1F600,属于辅助平面字符(不在基本多语言平面BMP范围内,BMP覆盖U+0000到U+FFFF)。 - UTF-16为了表示BMP之外的字符,会用两个16位的“代理字符”组合来实现:一个是高代理(范围U+D800到U+DBFF),一个是低代理(范围U+DC00到U+DFFF)。这两个字符单独拿出来属于无效的Unicode字符,分类就是
Surrogate。 - 你的代码流程:把😀转成UTF-8字节后再转回
string,得到的还是原本基于UTF-16编码的字符串。遍历这个字符串时,自然会拿到组成😀的两个代理字符,所以每次输出都是Surrogate。
内容的提问来源于stack exchange,提问作者MaKeSter
相关产品推荐
相关产品推荐

