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