2008-09-27 91 views

回答

7

C#(和.Net一般)透明地處理unicode字符串,除非應用程序需要使用特定的編碼讀/寫文件,否則不必做任何特殊的操作。在這些情況下,可以使用System.Text.Encodings命名空間中的類將託管字符串轉換爲所選編碼的字節數組。

1

只有在讀寫流時才考慮編碼。使用TextReader和TextWriters以不同的編碼讀寫文本。如果您有選擇,請始終使用utf-8。

不要被語言和文化混淆 - 這與unicode完全不同。

0

.net對i18n的支持比較好。你並不需要像unicode那樣思考unicode,因爲所有.Net字符串和內置的字符串函數都可以用unicode做正確的事情。唯一要記住的是,大多數字符串函數(例如DateTime.ToString())默認使用線程的文化,默認情況下是Windows文化。您可以在當前線程或每次方法調用中指定不同的區域性格式。

唯一的時間unicode是一個問題是當編碼/解碼字節和字節。

11

請記住,C#字符串是Char,UTF-16代碼單元的序列。它們是而不是 Unicode代碼點。某些unicode代碼點需要兩個字符,並且不應該在這些字符之間拆分字符串。

此外,unicode代碼點可以組合形成單一語言的「字符」 - 例如,'u'Char,然後是umlat Char。所以你不能在任意代碼點之間拆分字符串。

基本上,這是混亂的問題,任何給定的問題可能只會在實踐中影響你不知道的語言。

0

如前所述,.NET字符串透明地處理Unicode。除了文件I/O之外,其他考慮因素將在數據庫層。 SQL Server實例區分VARCHAR(非Unicode)和NVARCHAR(處理unicode)。還需要注意存儲過程參數。

2

System.String已經在內部處理了unicode,因此您在那裏覆蓋。最佳做法是在讀取和寫入文件時使用System.Text.Encoding.UTF8Encoding。它不僅僅是讀/寫文件,而是包括網絡連接在內的任何流式數據都將取決於編碼。如果你使用的是WCF,那麼對於大多數綁定,它將默認爲UTF8(實際上大多數情況下根本不允許使用ASCII)。

UTF8是一個不錯的選擇,因爲雖然它仍然支持整個Unicode字符集,但對於大多數ASCII字符集,它具有字節相似性。因此,不支持Unicode的幼稚應用程序有一些讀取/寫入應用程序數據的機會。當您開始使用擴展字符時,這些應用程序纔會開始失敗。

System.Text.Encoding.Unicode將寫入每個字符至少兩個字節的UTF-16,使其變得更大並且與ASCII完全不兼容。正如你所猜測的,System.Text.Encoding.UTF32仍然較大。我不確定UTF-16和32的真實世界用例,但是當您擁有大量擴展字符時,它們的性能可能會更好。這只是一個理論,但如果這是真的,那麼製作將主要用於這些語言的產品的日本/中國開發人員可能會發現UTF-16/32是更好的選擇。

相關問題