繁体   English   中英

c#解码器如何知道一个字符应使用的确切字节数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM