2010-10-17 103 views
1

在.NET中,一個字符串是一個unicode字符串。我的理解是字符串本身不包含任何特定的編碼信息,即編碼是否中性?只要編碼方法與解碼方法相匹配,您可以使用任何編碼方法將字符串解碼爲字節流,然後將字節流編碼爲可識別的字符串?是(unicode)字符串編碼中性嗎?

回答

3

是的,許多編碼方案不能容納所有Unicode碼點,這使得一些往返行程不具有冪等性。

+0

嗨我用中文編碼方案「Encoding.GetEncoding(936)」和StreamWriter類寫一箇中文字符串到.txt文件中。爲什麼記事本程序可以正確顯示字符,即使我沒有指定記事本程序使用哪種編碼?我知道有一個自動字節標記檢測,但我不認爲它可以自動檢測一個奇特的編碼方案? – Aperture 2010-10-17 09:17:55

+0

@孔徑:記事本將一些啓發式算法應用於文件的開頭,以計算編碼。如果通常得到正確的結果,但有可能愚弄它。 [詳見Michael Kaplan的博客。](http://blogs.msdn.com/b/michkap/archive/2007/04/22/2239345.aspx) – Richard 2010-10-17 09:54:32

+0

@Richard:Bravo!這裏充滿了知識淵博的人! – Aperture 2010-10-17 11:28:31

1

.NET中的「U​​nicode」是UTF-16或UCS-2(2字節)。它本身就是完整Unicode字符集的編碼,它需要32位(4字節,UCS-4)來保存所有字符。因此,您可以按原樣序列化這些字節,並且它們將在任何支持UTF-16的系統上進行恢復,這些系統將正確地反序列化它們。

5

.Net字符串由UTF-16字符組成。沒有「Unicode字符串」這樣的東西。它可以是UCS2或UCS4字符串,或UTF-7,UTF-8,UTF-16等各種轉換格式,但不能稱其爲「Unicode」。理解它們之間的區別很重要。

我知道.Net團隊中有人調用Encoding類「Unicode」的屬性,但它是一個錯誤。而且這個類還包含「默認」屬性,這是另一個錯誤的屬性。這導致了許多缺陷(大多數人不閱讀手冊,他們根本沒有意識到「Unicode」是UTF-16,「Default」是默認的OS代碼頁)。

至於你的問題的第二部分,答案不幸的是沒有。這將是「是」,但有一個小問題。它是GB18030編碼 - 中國PRC的標準編碼。它已經分配了Unicode標準中尚不存在的代碼點(尚未)。 Unicode標準的新版本可能會解決此問題。

這裏的一個重點(返回到UTF-16)是字節對轉換沒有必要。問題與代理對有關,您必須小心,因爲一個字符可以由兩個對定義,即四個字節。

如果你不在意支持GB18030編碼,你可以使用你提到的方法。如果碰巧你想在中國銷售你的軟件,你需要支持它,當然你必須非常小心(需要進行大量的測試)。

+0

嗨,謝謝澄清我的一個長期問題(UnicodeEncoding和UTF8Encoding有什麼區別)。那麼Unicode = UTF-16和UTF-8 = UTF-8? – Aperture 2010-10-17 09:22:52

+0

在GB18030編碼的情況下,您的意思是它定義的代碼點在16位UNICODE標準中甚至在32位UNICODE/ISO 10646標準中沒有任何coutnerparts? – 2010-10-17 09:23:49

+0

@Ondrey:從一個角度來說,我的意思是說GB18030比ISO 10646定義了更多的代碼點,所以沒有辦法轉換這些附加的代碼點。但是我聽說GB18030:2005指定了一些在Unicode 5.1中沒有等值的字形。我錯了嗎? – 2010-10-17 09:32:45