C#之字符編碼


  在 Windows Vista 及之后的版本中,每個Unicode字符都使用UTF-16編碼,UTF的全稱是 Unicode Transformation Format(Unicode 轉換格式)。UTF-16將每個字符編碼為2個字節(或者說16位)。Windows 之所以使用 UTF-16,是因為全球各地使用的大部分語言中,每個字符很容易用一個16位值來表示。這樣一來應用程序很容易遍歷字符串並計算出它的長度。但是,16位不足以表示某些語言的所有字符。對於這些語言,UTF-16 支持使用代理(suurrigate),后者是用32位(或者說4個字符)來表示一個字符的一種方式。由於只有少數應用程序需要表示這些語言中的字符,所以 UTF-16 在節省空間和簡化編碼這兩個目標之間,提供了一個很好的折衷。注意,.Net Framework 始終使用 UTF-16來編碼所有字符和字符串,所以在我們開發的 Windows 應用程序中,如果需要本機代碼(native code)和托管代碼之間傳遞字符或字符串,使用 UTF-16能改進性能和減少內存消耗。

  UTF-8 將一些字符編碼為1個字節,一些字符編碼為2個字節,一些字符編碼為3個字節,一些字符編碼為4個字節。值在0x0080一下的字符壓縮為1個字節,這對美國使用的字符非常合適。0x0080 和0x07FF之間的字符轉換為2個字節,這對歐洲和中東地區的語言非常使用。0x0800以上的字符都轉換為3個字節,適合東亞地區的語言。最后,代理對(surrogate pair)被寫為4個字節。UTF-8 是一種相當流行的編碼格式。但在對值為0x0800及以上的大量字符進行編碼的時候,不如 UTF-16 高效。

  UTF-32 將每個字符都編譯為4個字節。如果打算寫一個簡單的算法來遍歷字符(任何語言中使用的字符),但又不想處理字節數不定的字符,這種編碼方式就非常有用。例如,如果采用UTF-32 編碼方式,就不需要關系代理(surrogate)的問題,因為每個字符都是4個字節。顯然,從內存使用的角度來看,UTF-32 並不是一種高效的編碼格式。因此在將字符串保存到文件或傳到網絡的時候,很少會用到這種格式。這種編碼格式一般在應用程序內部使用。

為何要用Unicode

  Unicode 有利於應用程序本地化。

  只用 Unicode ,只需發布一個二進制(.exe或dll)文件,即可支持所有語言。

  Unicode 提升了應用程序的效率,因為代碼執行速度更快,占用內存更少。 Windows內部的一切工作都是使用 Unicode 字符和 Unicode 字符串來進行的。所以,加入我們堅持傳入 ANSI 字符或者字符串,Windows 就會被迫分配內存,並將 ANSI 字符或字符串轉換為等價的 Unicode 形式。

  使用 Unicode,應用程序能輕松調用所有尚未棄用(nondeprecated)的 Windows 函數,因為一些 Windows 函數提供的版本只能處理 Unicode 字符和字符串。

  使用 Unicode,應用程序的代碼很容易與 COM 集成(后者要求使用 Unicode 字符和 Unicode 字符串)。

  使用 Unicode,應用程序的代碼很容易與 .NET Framework 集成(后者要求使用 Unicode 字符和 Unicode 字符串)。

  使用 Unicode,能保證應用程序的代碼能夠輕松操縱我們自己的資源(其中的字符串總是 Unicode 形成的)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM