C# Visual Studio能否处理U+;20000个Unicode字符?怎样

C# Visual Studio能否处理U+;20000个Unicode字符?怎样,c#,visual-studio-2010,visual-studio,visual-studio-2012,unicode,C#,Visual Studio 2010,Visual Studio,Visual Studio 2012,Unicode,对于某些Unicode代码有多个字节,visual Studio可以处理这些字符吗?怎么做 以下为CJK的版本。现在一个字符可以超过一个字节 CJK统一表意文字扩展B(U+20000至U+2A6D6) CJK统一表意文字扩展C(U+2A700到U+2B734) CJK统一表意文字扩展名D(U+2B740到U+2B81D) CJK兼容表意文字补充(U+2F800至U+2FA1D) 我在Visual Studio 2012上的以下语句失败: char ch = '\u2A6D6'; 我还没有在

对于某些Unicode代码有多个字节,visual Studio可以处理这些字符吗?怎么做

以下为CJK的版本。现在一个字符可以超过一个字节

  • CJK统一表意文字扩展B(U+20000至U+2A6D6)
  • CJK统一表意文字扩展C(U+2A700到U+2B734)
  • CJK统一表意文字扩展名D(U+2B740到U+2B81D)
  • CJK兼容表意文字补充(U+2F800至U+2FA1D)
我在Visual Studio 2012上的以下语句失败:

char ch = '\u2A6D6';

我还没有在visual Studio 2013/visual Studio 2015上试用过。

此代码点不适合字符,因为字符只有16位,因此最多只支持65535个代码点。基本多语言平面(BMP)之外的字符可以使用代理项对编码为字符串中的两个UTF-16代码单元

char.ConvertFromUtf32(0x2A6D6)
返回一个包含两个
char
s的字符串,
“\uD869\uDED6”


代码点U+10000到U+10FFFF

其他平面(称为补充平面)的代码点通过称为代理对的16位代码单元对在UTF-16中进行编码,编码方式如下:

  • 从代码点减去0x010000,留下一个范围为0..0x0FFFFF的20位数字
  • 将前十位(范围为0..0x03FF的数字)添加到0xD800,以给出第一个代码单元或前导代理,其范围为0xD800..0xDBFF。(Unicode标准的早期版本将其称为高级代理。)
  • 低十位(也在0..0x03FF范围内)被添加到0xDC00以提供第二个代码单元或跟踪代理,其将在0xDC00..0xDFFF范围内。(Unicode标准的早期版本将其称为低代理。)

这个代码点不适合一个字符,因为字符只有16位,因此最多只支持65535个代码点。基本多语言平面(BMP)之外的字符可以使用代理项对编码为字符串中的两个UTF-16代码单元

char.ConvertFromUtf32(0x2A6D6)
返回一个包含两个
char
s的字符串,
“\uD869\uDED6”


代码点U+10000到U+10FFFF

其他平面(称为补充平面)的代码点通过称为代理对的16位代码单元对在UTF-16中进行编码,编码方式如下:

  • 从代码点减去0x010000,留下一个范围为0..0x0FFFFF的20位数字
  • 将前十位(范围为0..0x03FF的数字)添加到0xD800,以给出第一个代码单元或前导代理,其范围为0xD800..0xDBFF。(Unicode标准的早期版本将其称为高级代理。)
  • 低十位(也在0..0x03FF范围内)被添加到0xDC00以提供第二个代码单元或跟踪代理,其将在0xDC00..0xDFFF范围内。(Unicode标准的早期版本将其称为低代理。)

开始,VisualStudio应该能够很好地处理这些问题。但是,您的代码在C#中是不合法的。正如@CodesInChaos所提到的,.NET中的
char
s是UTF-16代码单元,而不是Unicode代码点。\uxxx转义序列只允许4个十六进制数字(2字节)。在C#中,通常会对0xFFFF以上的代码点使用\Uxxxxxxxx转义,但请注意,此转义序列被转换为两个代理UTF-16代码单元(即两个.NET
char
s),因此无法将其分配给
char
数据类型。如果需要使用
char
,则必须使用@codesincosis建议的代理,否则通常会执行以下操作:

string s = "\U0002A6D6";

旁注:我不认为扩展超过2字节是最近发生的,它确实发生了。

Visual Studio应该能够很好地处理它们。但是,您的代码在C#中是不合法的。正如@CodesInChaos所提到的,.NET中的
char
s是UTF-16代码单元,而不是Unicode代码点。\uxxx转义序列只允许4个十六进制数字(2字节)。在C#中,通常会对0xFFFF以上的代码点使用\Uxxxxxxxx转义,但请注意,此转义序列被转换为两个代理UTF-16代码单元(即两个.NET
char
s),因此无法将其分配给
char
数据类型。如果需要使用
char
,则必须使用@codesincosis建议的代理,否则通常会执行以下操作:

string s = "\U0002A6D6";

旁注:我不会说最近的扩展超过了2个字节,这是事实。

那么C中的字符是什么?Unicode字符的含义是什么?@A.NET
char
表示UTF-16代码单元,而不是Unicode代码点。我可以得出的结论是:1.)C中的字符不是Unicode中的字符!2.)C#中的字符串可以是UNICODE中的单个字符。3.)字符串。在计算Unicode字符时,这种情况下的长度可能是错误的。4.)Char.IsSurrogate()和Char.ishighsrogate()在这种情况下非常有用。那么,C#中的Char作为Unicode字符的含义是什么?@A.NET
Char
表示UTF-16代码单元,而不是Unicode代码点。我可以得出的结论是:1.)C#中的Char不是Unicode中的Char!2.)C#中的字符串可以是UNICODE中的单个字符。3.)字符串。在计算Unicode字符时,这种情况下的长度可能是错误的。4.)Char.IsSurrogate()和Char.ishighsrogate()在这种情况下非常有用。它们作为两个字符处理,一个低代理项和一个高代理项,形成一个。请参阅。同样的解释也适用于C#。Visual Studio是如何失败的?@LasseV.Karlsen这里的“失败”是指Visual Studio无法识别C#语句语法错误。因此,您指的是C#编译器。它们被处理为两个字符,一个低位和一个高位代理,形成一个。请参阅。同样的解释也适用于C#。Visual Studio是如何失败的?@LasseV.Karlsen这里的“失败”一词,I