2012-02-06 74 views
22

更新問題¹.NET平臺支持哪種版本的Unicode,以及哪種版本的Windows與字符類相關?

至於字符類,比較,分類,標準化和歸類,哪些Unicode版本或版本由.NET平臺的支持?

原來的問題

我記得有些隱約已經閱讀.NET支持Unicode版本3.0,並且內部UTF-16編碼是不是真的UTF-16,但實際使用UCS-2,這是不相同。看來,例如,上面U + FFFF的字符是不可能的,即考慮:

string s = "\u1D7D9"; // ("Mathematical double-struck digit one") 

它存儲的字符串"ᵽ9"

基本上,我尋找答案的最終參考以下幾點:

  • 如果它是不正確的UTF-16在.NET中,是什麼呢?
  • .NET支持哪種Unicode版本?
  • 如果最近的版本在不久的將來不被支持或計劃,是否有人知道(非)商業圖書館或我該如何解決此問題?

¹)我更新了一個問題,隨着時間的消逝,似乎對於答案和更大的社區比較合適。我留下了原始問題,以代替評論中哪些部分已被回答。在現在古老的32位Windows版本中,也使用了舊的UCS-2(無代理),.NET一直在內部使用UTF-16(帶有代理)。

+1

你究竟想要對這些角色做什麼?把它們放在一個帶有ASP.NET的網頁上?在WPF或WinForms界面中顯示它們? – 2012-02-06 15:15:35

+2

在這種情況下,「它似乎不起作用」是什麼意思? – Gabe 2012-02-06 15:47:06

+0

@JoeStrommen:我們正在實現一個新的基於XML的數據轉換工具集,我試圖找出我能否說「我們支持Unicode高達6.0」或者我們是否應該說點別的。另外,我正試圖找出如何繞過.NET中的可能限制。 – Abel 2012-02-06 15:52:43

回答

16

在內部,.NET是UTF-16。在某些情況下,例如當ASP.NET寫入響應時,默認情況下它使用UTF-8。他們兩人都能應付更高的飛機。

的原因是人們有時把.NET作爲UCS2是(我認爲,因爲我看到一些其他原因),該字符是嚴格的16位和一個字符不能被用來代表上飛機。但是,Char的靜態方法過載(例如Char.IsLetter)可以在字符串中的高平面UTF-16字符上運行。字符串被存儲爲真正的UTF-16。

您可以直接使用大寫字母\U來處理高Unicode代碼點 - 例如"\U0001D7D9" - 但是,只能在字符串中,而不是字符。

至於Unicode版本,from the MSDN documentation

「在.NET Framework 4,分選,套管,歸一化,和Unicode字符信息與Windows 7同步並符合的Unicode標準5.1」。

更新1:值得一但指出,這並不意味着的整體支持的Unicode 5.1 - 無論是在Windows 7中,也沒有在.NET 4.0中

Windows 8 targets Unicode 6.0 - 我猜測.NET Framework 4.5可能與此同步,但沒有發現任何消息來源證實它。再一次,這並不意味着整個標準的實施。

更新2:This note on Roslyn確認底層平臺限定了支持Unicode編譯器,並且在link to the code它解釋了C#6.0支持Unicode 6.0和向上(與C#標識符作爲結果的重大更改)。

更新3:由於.NET 4.5的版本new class SortVersion介紹通過調用靜態屬性SortVersion.FullVersion得到支持Unicode版本。微軟解釋說,.NET 4.0支持所有平臺上的Unicode 5.0,.NET 4.5支持Windows 7上的Unicode 5.0和Windows 8上的Unicode 6.0。這與the official "what is new" statement here略有不同,分別討論版本5.x和6.0。從我自己的(編輯器:Abel)經驗來看,在大多數情況下,似乎在.NET 4.0中,Unicode 5.1至少支持字符類,但我沒有測試排序,規範化和排序規則。這看起來與上面引用的MSDN中的內容一致。

+1

關於'char'的好的觀察。我注意到'char uni =「\ U0002B740」.ToCharArray()[0];'顯示「55405」,它只是UTF-16代理對的一半。從你的參考文獻可以看出,嘗試在'\ u0526'上的Char.IsLetter(錯誤地)顯示爲'false',因爲它只是用Unicode 6引入的。 – Abel 2012-02-06 16:20:33

+1

(接受這個是因爲你顯示了我正在尋找的參考,太愚蠢以至於找不到在明顯的位置,但是,其他答案本身是有價值的) – Abel 2012-02-06 16:24:15

+1

這可能是獲取單個字符信息的有用起點:[MSDN鏈接](http://msdn.microsoft.com/zh-cn/我們/庫/ system.globalization.stringinfo.aspx)。由於char不能包含超過一半,因此StringInfo方法會返回一個字符串,而不是完整的UTF-16對(如果字符*是*一對 - 否則它只返回單個字符 - 作爲字符串或字符+組合用於組合變音符的字符)。 – JimmiTh 2012-02-06 16:41:02

4

MSDN涵蓋了它短暫的位置:http://msdn.microsoft.com/en-us/library/9b1s4yhz(v=vs.90).aspx

我嘗試這樣做:

static void Main(string[] args) { 
     string someText = char.ConvertFromUtf32(0x1D7D9); 
     using (var stream = new MemoryStream()) { 
      using (var writer = new StreamWriter(stream, Encoding.UTF32)) { 
       writer.Write(someText); 
       writer.Flush(); 
      } 
      var bytes = stream.ToArray(); 
      foreach (var oneByte in bytes) { 
       Console.WriteLine(oneByte.ToString("x")); 
      } 
     } 
    } 

,並得到含有正確的BOM和\ u1D7D9碼點的正確表示字節數組的轉儲,對於這些編碼:

  • UTF8
  • UTF 32
  • 的Unicode (UTF-16)

所以我的猜測是,更高層面的支持,而UTF-16是真的UTF-16 (而不是UCS-2)

+0

感謝您展示簡單的方法。它似乎確實是UTF-16,而不是UCS-2(不再是?)。字符和所有的編碼在這裏:http://www.fileformat.info/info/unicode/char/1d7d9/index.htm – Abel 2012-02-06 16:08:33

+0

順便說一句,我讀了參考,但沒有找到關於支持什麼版本的確切信息Unicode格式。 – Abel 2012-02-06 16:26:07

5

支持該字符。有一點要注意的是,對於具有超過2個字節的Unicode字符,則必須以大寫「\ U」聲明它們,就像這樣:

string text = "\U0001D7D9"

如果你創建的那個字符一個WPF應用程序文本塊,它應該完美地呈現雙一角色。

+1

還有一件事:閱讀http://msdn.microsoft.com/en-us/library/aa664669(v=vs.71).aspx,瞭解如何在字符串中表示2個字節的字符。 – 2012-02-06 15:44:18

0

的.NET Framework 4.6和4.5和4和3.5和3.0 - Unicode標準,版本5.0 .NET Framework 2.0和1.1 - Unicode標準,版本3.1

的完整的答案可以發現here根據備註部分。

+0

請參閱我對原始答案所作的修改,這不像MSDN頁面似乎建議的那樣。實際上,該頁面僅討論Unicode字符類別,這與字符編碼或支持的字符範圍並不相同,但即使是在框架版本和底層操作系統之間也是如此。有關詳細信息,請參閱[有關SortVersion的MSDN文章](https://msdn.microsoft.com/en-us/library/system.globalization.sortversion%28v=vs.110%29.aspx)(但要警告,甚至該頁面不完整)。 – Abel 2015-05-12 23:34:01

相關問題