如何获取含中文字符与ASCII码的字符串实际长度?
获取字符串的实际字节长度(针对双字节中文场景)
你的问题本质是混淆了字符数(UTF-16代码单元数)和特定编码下的字节数,下面一步步帮你解决:
为什么之前的方法不符合需求?
str.Length返回的是字符串中UTF-16代码单元的数量。在.NET里,普通中文字符(大部分BMP平面的汉字)都是用1个UTF-16代码单元表示的,所以会把每个中文字符算成1个,得到的是9而不是你要的11。Encoding.ASCII.GetBytes(str)会把所有非ASCII字符替换成?(ASCII码63),这是因为ASCII编码本身不支持中文,所以这个方法完全不适合用来计算中文的字节数。
正确的解决方法
你需要使用支持双字节中文的编码(比如GBK或GB2312)来计算字节数,这类编码下普通中文字符占2字节,ASCII字符占1字节,正好符合你的需求。示例代码:
string str = "Test娓│123"; // 使用GBK编码计算字节数(推荐,兼容更多中文) int actualByteLength = Encoding.GetEncoding("GBK").GetByteCount(str); Console.WriteLine(actualByteLength); // 输出11,符合预期如果你需要严格对应GB2312编码,也可以替换成:
int actualByteLength = Encoding.GetEncoding("GB2312").GetByteCount(str);额外说明
- 如果你用UTF-8编码计算,中文字符会占3字节,得到的结果会是16(4个ASCII字符 + 3个中文*3字节 + 3个数字=4+9+3=16),这不符合你的需求,所以一定要选对编码。
- 注意:如果字符串里包含GBK/GB2312不支持的生僻字或特殊字符,这些字符会被替换成
?,此时计算的字节数也会不准确,需要提前确认你的字符集范围。
内容的提问来源于stack exchange,提问作者Pikachu620
相关产品推荐
相关产品推荐

