.net中的字符大小不符合预期?

时间:2012-05-10 19:19:39

标签: c# .net .net-4.0 char

char的大小为:2(msdn

sizeof(char)  //2

测试:

char[] c = new char[1] {'a'};

Encoding.UTF8.GetByteCount(c) //1 ?

为什么值为1?

(当然,如果c是像'ש'那样的unicode字符,那么它确实显示2应该。)

a不是.net char?

3 个答案:

答案 0 :(得分:14)

这是因为'a'只需要一个字节来编码UTF-8。

Encoding.UTF8.GetByteCount(c)将告诉您在UTF-8中对给定的字符数组进行编码需要多少字节。有关详细信息,请参阅Encoding.GetByteCount的文档。这与.NET内部char类型的宽度完全不同。

每个代码点小于128的字符(即U + 0000到U + 007F)都需要一个字节来编码为UTF-8。

其他字符在UTF-8中占用2,3或甚至4个字节。 (有超过U + 1FFFF的值,需要5或6个字节进行编码,但它们目前不属于Unicode,可能永远不会。)

请注意,在UTF-8中编码4个字节的唯一字符无论如何都不能在单个char中编码。 char是UTF-16代码单元,U + FFFF上的任何Unicode代码点都需要两个UTF-16代码单元组成代理对来代表它们。

答案 1 :(得分:4)

原因是,在内部,.NET将字符表示为UTF-16,其中每个字符通常占用2个字节。另一方面,在UTF-8中,每个字符占用1个字节,如果它在前128个代码点(偶然与ASCII重叠)中,并且超过2个或更多字节。

答案 2 :(得分:4)

这不公平。你提到的页面说

  

char关键字用于声明Unicode字符

然后尝试:

Encoding.Unicode.GetByteCount(c)