首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Visual可以将U+20000 Unicode作为char处理吗?多么?

Visual可以将U+20000 Unicode作为char处理吗?多么?
EN

Stack Overflow用户
提问于 2014-06-12 19:03:20
回答 2查看 865关注 0票数 3

有些Unicode代码有多个字节,视觉工作室能处理这些字符吗?多么?

下面是CJK的http://www.unicode.org发行版。现在,一个字符可以是多个字节。

  • 统一表意文字扩展B (U+20000通过U+2A6D6)
  • 统一表意文字扩展C (U+2A700通过U+2B734)
  • 统一表意文字扩展D (U+2B740通过U+2B81D)
  • CJK兼容性表意文字补充(U+2F800通过U+2FA1D)

下面的语句在Visual 2012上失败:

代码语言:javascript
复制
char ch = '\u2A6D6';

我还没有尝试使用2013 / 2015。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-12 19:05:36

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

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

代码将U+10000指向U+10FFFF 来自其他平面的编码点(称为辅助平面)是由称为代理对的16位代码对在UTF-16中编码的,其编码方案如下:

  • 从代码点减去0x010000,在0..0x0FFFFF范围内留下一个20位数字。
  • 将前十位(在0.0x03FF范围内的一个数字)添加到0xD 800中,以给出第一个代码单元或引线代理项,它将位于0xD 800.0xDBFF范围内。( Unicode标准的早期版本将这些称为高级代理。)
  • 将低10位(也在0.0x03FF范围内)添加到0xDC00中,以给出第二个代码单元或跟踪代理,它将位于0xDC00.0xDFFF范围内。( Unicode标准的早期版本将这些称为低代理。)

来自http://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B10000_to_U.2B10FFFF

票数 4
EN

Stack Overflow用户

发布于 2014-06-12 19:39:06

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

代码语言:javascript
复制
string s = "\U0002A6D6";

附带注意:我不会将扩展称为最近的2字节,而是发生了差不多20年前

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24192035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档