2011-05-03 57 views
18

我對文本的編碼做了很少的工作。說實話,我真的不知道它究竟意味着什麼。瞭解文本編碼(在.Net中)

舉例來說,如果我有這樣的:

Dim myStr as String = "Hello" 

是在一個特定的格式,「編碼」的記憶是什麼?這種格式取決於我使用的語言嗎?如果我在另一個國家,例如中國,並且我有一串中文(普通話?我的道歉,如果我在這裏使用了錯誤的單詞)會使用以下代碼(我已經使用了罰款對英文字符串)仍然工作相同?

System.Text.UTF8Encoding encoding=new System.Text.UTF8Encoding(); 
return encoding.GetBytes(str); 

或者當你的.Net字符串轉換爲UTF8Encoding時轉換無效就會失去所有的意義?

最後,我已經使用.Net幾年了,我從來沒有見過,聽說過,或者不得不做任何與編碼。我是個例外,還是不是常見的事情?

+3

很好的問題......很多開發者都以此爲榮,以我的經驗。 – jeroenh 2011-05-03 07:35:09

回答

25

.NET字符串類使用UTF16來編碼字符串,即每個字符2個字節(儘管它允許兩個字符組成特殊的4字節字符,即所謂的「代理對」)。

UTF8另一方面將使用表示特定Unicode字符所需的可變數量的字節,即對於常規ASCII字符只有一個字節,但對於中文字符可能只有3個字節。這兩種編碼都允許表示所有的Unicode字符,因此它們之間總是有一個映射關係 - 兩者都是相同(unicode)字符集的不同二進制表示(即存儲在內存或磁盤中)。由於並非所有的Unicode字符都能夠適應UTF-16保留的原始2個字節,所以該格式還允許表示兩個UTF-16字符的組合以形成4個字節的字符 - 如此形成的字符被稱爲一個「代理」或代理對,是一對16位的Unicode編碼值,它們一起代表一個字符。

UTF-8沒有這個問題,因爲每個Unicode字符的字節數不固定。可以收集關於UTF-8,UTF-16和BOM的良好總體概述here

極好概述/介紹Unicode字符編碼是The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets

+0

謝謝你的鏈接(和你的答案的其餘部分) – 2011-05-03 02:03:42

+0

真棒文章! (「絕對最低...」) 我以爲我有一個很好的理解,並仍然學到了一些東西。 閱讀它! – 2014-04-11 12:43:22

1

UTF是特定類型的具有多個不同尺寸的編碼。每種編碼類型都是多少內存以及該內存中字符所需的表示。

通常我們使用Unicode和Ascii。

Unicode是每字符2字節。
Ascii是每個字符1個字節。

Ascii可以用unicode表示。然而Unicode不能用ascii表示,不用編碼。

UTF編碼使用特殊字符'%'告訴您,以下是編碼字符的十六進制值。

%20例如是字符32,它實際上是一個空格。

http://www.google.com?q=space%20character 

放置該URL在瀏覽器中的UTF-8解碼該字符串和q =實際上將被解釋爲「空格字符」注意到%20現在是一個空間。

UTF-16使用2字節並表示爲這樣。

http://www.google.com?q=space%0020character 

這個例子實際上會失敗,因爲URI實際上應該使用UTF-8,但這個例子證明了這一點。

Unicode字符將是0020或兩個字節值分別爲0和32。

普通話將是某種類型的Unicode字符,而UTF-16將編碼Unicode,因此它可以在Ascii中表示。

這裏是一個wiki文章深入

http://en.wikipedia.org/wiki/UTF-8

9

第一,foremeost解釋多一點:不要絕望,你並不孤單。一般來說,對字符編碼和文本表示的處理的認識是不常見的,但現在沒有比現在更好的開始學習的時間了!

在包括.NET在內的現代系統中,文本字符串在內存中由Unicode code points的某種編碼表示。這些只是數字。字符A的代碼點是65。版權(c)的代碼點是169。泰國數字6的代碼點是3670

術語「編碼」是指這些數字如何在內存中表示。有一些標準編碼被使用,以便在數據從一個系統傳輸到另一個系統時,文本表示可以保持一致。

一個簡單的編碼標準是UCS-2,其中代碼點以原始形式存儲爲16位字。這是有限的,因爲它只能代表代碼點0000-FFFF,這樣的範圍並不包括Unicode代碼點的全部寬度。

UTF-16是.NET String類內部使用的編碼。大多數字符都適用於單個16位字,但大於FFFF的值使用代理對進行編碼(請參閱Wiki)。由於這種編碼方案,代碼點D800-DFFF不能被UTF-16編碼。

UTF-8也許是今天使用的最流行的編碼,有許多理由在Wiki文章中有概述。