C# 中 char并不等于抽象字符,或者说是显示元素,也可以说是文本元素。比如“𪚥”这个 显示元素,它是由2个char组成。 严格意义来说char等于unicode字符集下由utf-16编码后对应的编码值。比如,“𪚥”这个文本元素,它的utf-16的 编码值为
码点为 1101100001101001 1101111010100101
而根据utf-16编码方案,“𪚥”这个对应的unicode码点 为 0001 1010 0110 1010 0101,对应unicode字符集的 Code point为 0x01A6A5,该码点使用了代理项,所以有utf-16编码后,有4字节。
而在c#中,该文本元素对应两个char,分别为以utf-16进行编码的码值,即 \ud869 \udea5,该值对应二进制为上述 1101100001101001 1101111010100101。
除了高低位代理外,还会有组合字符,比如这个 ”a\u0304\u0308“,它是一个组合字符,代表 ”ā̈”。
所以总结下:C#中一般情况下,在unicode码点为 0x000000 -0x00ffff以内的,Char就为该码点的utf-16编码值,也等于unicode码点。
在0x010000 - 0x10ffff范围的,由于有代理项的存在,所以一个unicode码点的utf-16 对应4字节, 对应 2个char。
在组合字符的情况下,几个char可以组合成一个组合字符或者显示元素。比如这个 ”a\u0304\u0308“,它是一个组合字符,代表 ”ā̈”,它有3个char。