Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对于字符类,哪个.NET平台和哪个Windows版本支持哪个Unicode版本?_C#_.net_Utf 16_Ucs2_Astral Plane - Fatal编程技术网

C# 对于字符类,哪个.NET平台和哪个Windows版本支持哪个Unicode版本?

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“ 我基本上是在寻找以下答案的明确参

更新的问题\

关于字符类、比较、排序、规范化和排序规则,哪些.NET平台支持哪些Unicode版本

原始问题

我记得有点模糊地读过.NET支持Unicode 3.0版,内部UTF-16编码不是真正的UTF-16,而是实际使用UCS-2,这是不一样的。例如,看起来U+FFFF以上的字符是不可能的,即考虑:

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。)