我有一个string
,其中包含中文字符和可显示的ASCII代码。
string str = "Test測試123";
当我使用str.Length
或str.ToCharArray()
时,它们都将中文字符返回为 1个字符!这不是真的,因为任何中文字符 2字节!
即使我尝试Encoding.ASCII.GetBytes(str)
,也只是在所有汉字中给我 63 !结果与Length
或ToCharArray()
!
出于我的目的,错误的结果是什么!!!
有没有办法获得字符串的实际长度!?
在我给出的例子中:11而不是9!
答案 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
等于9
,len2
等于18
,len3
(所以如果转换为UTF8则以字节为单位)等于13
,len4
等于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