如何获取字符串的字节长度?

Mr *_*ace -1 c# string encoding

我有一个这样的字符串:

string a1 = "{`name`:`?????_?????????`,`shortName`:`?????`,`hideByDefault`:false}";
Run Code Online (Sandbox Code Playgroud)

a1. length显示字符串长度为68,这是不正确的:西里尔符号是两倍大(我认为是因为 UTF-16 编码),因此该字符串的实际长度是87

我需要获取字符串中西里尔符号的数量或以任何其他方式获取真实的字符串长度。

xan*_*tos 7

MSDN

.NET Framework 使用 UTF-16 编码(由 UnicodeEncoding 类表示)来表示字符和字符串

所以a1.Length是UTF-16代码单元(什么是字符,代码点,字形和一字形之间的区别?)。位于基本 BMP(基本多语言平面)中的西里尔字符都使用单个代码单元(因此是单个char)。例如,许多表情符号使用两个代码单元(两个char、4 个字节!)...它们不在 BMP 中。参见例如https://ideone.com/ASDORp

如果您想要以字节为单位的大小,a1.Length * 2显然是长度 :-) 如果您想知道 UTF8(一种非常常见的编码,未在 .NET 内部使用,但在网络、xml 等中非常使用)有多少字节它将是Encoding.UTF8.GetByteCount(a1)