簡體   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