我有一个字符串
,它由汉字和可显示的ASCII码混合组成。
string str = "Test測試123";
当我使用str.Length
或str.ToCharArray()
时,它们都以1 个字符 的形式返回汉字!这不是真的,因为任何汉字都是 2 字节!
即使我尝试 Encoding.ASCII.GetBytes(str)
,它也只会给我 ALL 汉字中的 63!! !结果与 Length
或 ToCharArray()
的结果相同!
就我的目的而言,哪个是错误的结果!!!
有什么方法可以获取字符串的实际长度!?
在我刚刚给出的例子中:11 而不是 9!?
最佳答案
Unicode 世界中的长度总是很有趣...您需要什么长度?例如:
string str = "🤣";
// Length in UTF-16 code units
int len = str.Length; // 2
// Length in bytes, if encoded in UTF16, as done by .NET
int len2 = str.Length * 2; // 4
// Length in bytes, if encoded in UTF8
int len3 = Encoding.UTF8.GetByteCount(str); // 4
// Length in unicode code points
int len4 = Encoding.UTF32.GetByteCount(str) / 4; // 1
请注意,还有第五个长度:字素簇数量的长度,计算起来更加复杂,因为一些代码点可以“合并”在一起,还有第六个长度:字形数量的长度。
现在,您的字符串的 len
等于 9
,len2
等于 18
,len3
(如果转换为 UTF8,则以字节为单位的长度)等于 13
,len4
等于 9。
几乎所有的汉字都在Unicode标准的Basic Multilingual Plane中,所以它们的长度为1个UTF-16编码单元,在UTF8中它们可以映射到2或3个字节。
一些有趣的引用:What's the difference between a character, a code point, a glyph and a grapheme? .
啊...请忘记 Encoding.ASCII
。像它不存在一样生活。它可能不是你想的那样。即使您生活在充满有趣字符的旧 MS DOS 世界中,那也不是 ASCII。
关于c# - 字符串的实际长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50506915/