由于某些Unicode代码有多个字节,可视工作室可以处理这些字符吗?怎么样?
下面针对CJK发布{p> http://www.unicode.org。现在一个字符可能超过一个字节。在Visual Studio 2012上,我的声明失败:
char ch = '\u2A6D6';
我还没有尝试过Visual Studio 2013 / Visual Studio 2015。
答案 0 :(得分:3)
这个代码点不适合char,因为char只有16位,因此只支持高达65535的代码点。基本多语言平面(BMP)之外的字符可以编码为两个UTF-16使用代理对的字符串中的代码单元。
char.ConvertFromUtf32(0x2A6D6)
返回包含两个char
s,"\uD869\uDED6"
来自wikipedia - UTF-16 的代码点U + 10000到U + 10FFFF
来自其他平面(称为补充平面)的代码点由UTF-16编码,由称为代理对的16位代码单元对,通过以下方案:
从代码点中减去
- 0x010000,在0..0x0FFFFF范围内留下20位数字。
- 前十位(0..0x03FF范围内的数字)被添加到0xD800以给出第一个代码单元或引导代理,它将在0xD800..0xDBFF范围内。 (早期版本的Unicode标准将这些称为高代理。)
- 低十位(也在0..0x03FF范围内)被添加到0xDC00以给出第二个代码单元或路径代理,它将在0xDC00..0xDFFF范围内。 (早期版本的Unicode标准将这些称为低代理。)
答案 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。