字符串的实际长度

时间:2018-05-24 10:25:10

标签: c# string size ascii

我有一个string,其中包含中文字符和可显示的ASCII代码。

string str = "Test測試123";

当我使用str.Lengthstr.ToCharArray()时,它们都将中文字符返回为 1个字符!这不是真的,因为任何中文字符 2字节

即使我尝试Encoding.ASCII.GetBytes(str),也只是在所有汉字中给我 63 !结果与LengthToCharArray()

的结果相同

出于我的目的,错误的结果是什么!!!

有没有办法获得字符串的实际长度!?

在我给出的例子中:11而不是9!

2 个答案:

答案 0 :(得分:7)

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等于9len2等于18len3(所以如果转换为UTF8则以字节为单位)等于13len4等于9。

几乎所有中文字符都在Unicode标准的基本多语言平面中,因此它们的长度为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。

答案 1 :(得分:0)

中文的宽度是英语的两倍,但字符代码的长度是另外一回事,UTF-8中文占三个字节,英语总是一个字节。

//only for UTF-8
string s = "計算字串的長度this is a test";
int sLength = s.Length; //length is 21
int byteCount = Encoding.UTF8.GetByteCount(s); // byte count is 35
int chineseCount = (byteCount - sLength)/2; //Chinese count is 7