.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
这是因为"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)