.net 中的字符大小与预期不符

本文关键字:字符 net | 更新日期: 2023-09-27 18:33:52

char 的大小是:2 (msdn)

sizeof(char)  //2

一个测试 :

char[] c = new char[1] {'a'};
Encoding.UTF8.GetByteCount(c) //1 ?

为什么值是 1?

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

a不是.net char

.net 中的字符大小与预期不符

这是因为"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 的一部分,可能永远不会是。

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

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

不公平。你提到的页面说

char 关键字用于声明 Unicode 字符

然后尝试:

Encoding.Unicode.GetByteCount(c)