2012-02-06 129 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

相关问题