[英]How does c# decoder know the exact number of bytes it should use for one char?
例如,一个流具有四个字节: D8 00 DC 05 。 解码器(例如System.Text.Decoder
)如何知道应将它们视为一个字符\?\?
还是两个单独的字符\?
和\?
? 谢谢。
也许我没有清楚地描述我的问题。 我的初衷是要了解UTF8解码器如何知道它应用于一个字符的确切字节数,因为一个UTF8字符可以占用一到四个字节,而处理此变量的方法就是魔术。 对于代理对,UTF16解码器没有此问题。 上面的示例不适用于我的问题。
您可以看一下.NET Framework源代码 。
System.Text.Decoder的源代码放在此处 。 因此,您可以在此处找到您想知道的有关问题的所有信息。
您的问题实际上是关于UTF-16和代理对 。
两个代码单元 U + D800和U + DC05始终代表代理对。 这两个代码单元合并为一个代码点,即一个字符。
正如您所注意到的,C#调用代码单元char
可能有点误导,因为有时它需要两个char
值(一对代理)来创建一个“字符”。
任何码单元( char
U + D800和U + DBFF之间)值总是代表一个代理对的下部 ,而U + DC00和U + DFFF之间的任何代码单元是对相应的上部 。
此域外的代码单元(即U + 0000到U + D7FF或U + E000到U + FFFF)代表它们自己,因此在这些范围内,一个UTF-16代码单元对应一个Unicode代码点。
编辑:问题已更改为改为询问有关UTF-8 。
我会用这个词八位组正好是8位的字(所以一个字节是大多数人所说的字节 )。
在UTF-8中,您可以从八位位组中该八位位组在UTF-8序列中所属的第一个0位的位置看到。
0xxxxxxx
:如果第一位为0,则此八位字节构成一个1字节的序列(ASCII值) 10xxxxxx
:如果八位位组从10
开始,这是一个连续八位位组,即不是序列中的初始位 110xxxxx
:这是2字节序列中的初始字节 1110xxxx
:这是3字节序列中的初始字节 11110xxx
:这是4字节序列中的初始字节 由于现代UTF-8不允许5个字节或更长的序列,所以以8个字节( 11111xxx
开头的字节是非法的。 但在早期版本中,上述方案将扩展为允许5个字节和6个字节的序列(有时也更长)。
在比较UTF-16和UTF-8时,请注意,在UTF-16中仅需要单个16位代码单元的代码点完全对应于可以用1个,2个或3个字节的序列组成的代码点在UTF-8中。 而在UTF-16中需要代理对的代码点(即两个UTF-16代码单元)与在UTF-8中需要4个八位字节序列的代码点完全对应。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.