4

char 的大小为:2 ( msdn )

sizeof(char)  //2

一个测试 :

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

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

为什么值为 1?

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

a不是 .net char 吗?

4

3 回答 3

14

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

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

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

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

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

于 2012-05-10T19:20:57.240 回答
4

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

于 2012-05-10T19:22:00.887 回答
4

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

char 关键字用于声明 Unicode 字符

那就试试吧:

Encoding.Unicode.GetByteCount(c)
于 2012-05-10T19:23:17.193 回答