C# 对于字符类,哪个.NET平台和哪个Windows版本支持哪个Unicode版本?
更新的问题\ 关于字符类、比较、排序、规范化和排序规则,哪些.NET平台支持哪些Unicode版本 原始问题 我记得有点模糊地读过.NET支持Unicode 3.0版,内部UTF-16编码不是真正的UTF-16,而是实际使用UCS-2,这是不一样的。例如,看起来U+FFFF以上的字符是不可能的,即考虑:C# 对于字符类,哪个.NET平台和哪个Windows版本支持哪个Unicode版本?,c#,.net,utf-16,ucs2,astral-plane,C#,.net,Utf 16,Ucs2,Astral Plane,更新的问题\ 关于字符类、比较、排序、规范化和排序规则,哪些.NET平台支持哪些Unicode版本 原始问题 我记得有点模糊地读过.NET支持Unicode 3.0版,内部UTF-16编码不是真正的UTF-16,而是实际使用UCS-2,这是不一样的。例如,看起来U+FFFF以上的字符是不可能的,即考虑: string s = "\u1D7D9"; // ("Mathematical double-struck digit one") 并且它存储字符串”ᵽ9“ 我基本上是在寻找以下答案的明确参
string s = "\u1D7D9"; // ("Mathematical double-struck digit one")
并且它存储字符串”ᵽ9“
我基本上是在寻找以下答案的明确参考:
- 如果.NET中的UTF-16不是真的,那是什么
- .NET支持哪个版本的Unicode
- 如果近期不支持或计划使用最新版本,是否有人知道(非)商业图书馆,或者我如何解决这个问题
1)随着时间的推移,我更新了这个问题,它似乎更适合于答案和更大的社区。我把原来的问题留在评论中回答了哪些部分。旧的UCS-2(无代理)也用于现在古老的32位Windows版本中。NET在内部一直使用UTF-16(带代理)。MSDN在此简要介绍了它: 我试过这个:
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
- UTF32
- Unicode(UTF-16)
所以我的猜测是支持更高的平面,而且UTF-16实际上是UTF-16(而不是UCS-2)支持该字符。需要注意的一点是,对于超过2字节的unicode字符,必须使用大写“\U”声明它们,如下所示:
string text=“\U0001D7D9”
如果在文本块中创建一个带有该字符的WPF应用程序,它将完美地呈现双1字符。在内部,.NET是UTF-16。在某些情况下,例如ASP.NET写入响应时,默认情况下使用UTF-8。它们都能处理更高的平面 人们有时将.NET称为UCS2的原因是(我认为,因为我看不到其他原因),字符严格来说是16位的,单个字符不能用来表示上层平面。但是,Char确实具有静态方法重载(例如,
Char.isleter
),可以对字符串中的高平面UTF-16字符进行操作。字符串存储为真正的UTF-16
您可以直接使用大写字母\U
-例如“\U0001D7D9”
-来寻址高Unicode码点,但同样,只能在字符串内部,而不能在字符内部
至于Unicode版本:
在.NET Framework 4中,排序、大小写、规范化和Unicode字符信息与Windows 7同步,并符合Unicode 5.1标准
更新1:然而,值得注意的是,这并不意味着Unicode 5.1的全部都受支持,无论是在Windows 7还是.NET 4.0中
-我猜.NET Framework 4.5可能会与之同步,但没有找到证实这一点的来源。再一次,这并不意味着整个标准都得到了实施
更新2:确认底层平台定义了对编译器的Unicode支持,并在中解释了C#6.0支持Unicode 6.0及以上版本(结果是C#标识符发生了重大变化)
更新3:自从引入.NET 4.5版以来,通过调用static属性获取受支持的Unicode版本。在上,Microsoft解释说.NET 4.0在所有平台上都支持Unicode 5.0,.NET 4.5在Windows 7上支持Unicode 5.0,在Windows 8上支持Unicode 6.0。这与5.x版和6.0版略有不同。根据我自己(编辑:Abel)的经验,在大多数情况下,至少在.NET4.0中,Unicode 5.1至少在字符类中是受支持的,但我没有测试排序、规范化和排序规则。这似乎与上面引用的一致。.NET Framework 4.6和4.5以及4和3.5和3.0 -Unicode标准,版本5.0 .NET Framework 2.0和1.1 -Unicode标准,版本3.1
完整的答案可以在备注部分找到。你到底想用这些字符做什么?用ASP.NET将它们放在网页中?在WPF或WinForms界面中显示它们?在这种情况下,“它似乎不起作用”意味着什么?@JoeStrommen:我们正在实施一个新的基于XML的数据转换工具集,我试图找出我是否可以说“我们支持Unicode高达6.0”,或者我们是否应该说其他什么。此外,我正在试图找出如何绕过.NET中可能存在的限制。@Gabe:我更新了我的问题,希望它现在更清楚。哦,看起来你只是在C#中使用了错误的转义机制--它与.NET无关。您的字符串被解释为“\u1D7D”+“9”。您只需要“\U0001D7D9”。还有一件事:请阅读有关如何在字符串中表示>2字节字符的说明。感谢您展示了一种简单的方法。它看起来确实是UTF-16,而不是UCS-2(再也不是了?)。字符及其所有编码都在这里:顺便说一句,我读了那个参考资料,但没有找到关于Unicode支持哪个版本的确切信息。我确实注意到
char uni=“\U0002B740”.ToCharArray()[0]代码>显示“55405”,它只是UTF-16代理项对的一半。根据您的参考,在\u0526
上尝试Char.isleter(错误地)会显示false
,因为它只是在Unicode 6中引入的。(接受此项,因为您显示了参考I是loo。)