Visual Studio可以将U + 20000 Unicode作为char处理吗?怎么样?

时间:2014-06-12 19:03:21

标签: c# visual-studio-2010 visual-studio visual-studio-2012 unicode

由于某些Unicode代码有多个字节,可视工作室可以处理这些字符吗?怎么样?

下面针对CJK发布{p> http://www.unicode.org。现在一个字符可能超过一个字节。

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

2 个答案:

答案 0 :(得分:3)

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

char.ConvertFromUtf32(0x2A6D6)返回包含两个char s,"\uD869\uDED6"

的字符串
  

代码点U + 10000到U + 10FFFF

     

来自其他平面(称为补充平面)的代码点由UTF-16编码,由称为代理对的16位代码单元对,通过以下方案:

     
      从代码点中减去
  • 0x010000,在0..0x0FFFFF范围内留下20位数字。
  •   
  • 前十位(0..0x03FF范围内的数字)被添加到0xD800以给出第一个代码单元或引导代理,它将在0xD800..0xDBFF范围内。 (早期版本的Unicode标准将这些称为高代理。)
  •   
  • 低十位(也在0..0x03FF范围内)被添加到0xDC00以给出第二个代码单元或路径代理,它将在0xDC00..0xDFFF范围内。 (早期版本的Unicode标准将这些称为低代理。)
  •   
来自wikipedia - UTF-16

答案 1 :(得分:1)

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

string s = "\U0002A6D6";

旁注:我最近不会将扩展调用超过2个字节,它发生了almost 20 years ago