C#中的String.Length获取中文字符串长度出错
2013-04-19 10:33
579 查看
项目需要截取中文字符,中文字符大于255的时候,需要截取字符,在这里出现了问题。因为使用的是String.length。
Length 属性返回此实例中 Char 对象的个数,而不是 Unicode 字符个数。 原因在于一个 Unicode 字符可能会用多个 Char 表示。 使用System.Globalization.StringInfo 类来处理每个 Unicode 字符而不是每个 Char
附上获取中文字符长度,并截取的类的代码
Length 属性返回此实例中 Char 对象的个数,而不是 Unicode 字符个数。 原因在于一个 Unicode 字符可能会用多个 Char 表示。 使用System.Globalization.StringInfo 类来处理每个 Unicode 字符而不是每个 Char
附上获取中文字符长度,并截取的类的代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Common { public static class SplitWorld { /// <summary> /// 获取中英文混排字符串的实际长度(字节数) /// </summary> /// <param name="str">要获取长度的字符串</param> /// <returns>字符串的实际长度值(字节数)</returns> public static int Length(string str) { if (str.Equals(string.Empty)) return 0; int strlen = 0; ASCIIEncoding strData = new ASCIIEncoding(); //将字符串转换为ASCII编码的字节数字 byte[] strBytes = strData.GetBytes(str); for (int i = 0; i <= strBytes.Length - 1; i++) { if (strBytes[i] == 63) //中文都将编码为ASCII编码63,即"?"号 strlen++; strlen++; } return strlen; } /// <summary>截取指定字节长度的字符串</summary> /// <param name="str">原字符串</param> ///<param name="len">截取字节长度</param> /// <returns>string</returns> public static string SubString(string str, int len) { string result = string.Empty;// 最终返回的结果 if (string.IsNullOrEmpty(str)) { return result; } int byteLen = System.Text.Encoding.Default.GetByteCount(str); // 单字节字符长度 int charLen = str.Length; // 把字符平等对待时的字符串长度 int byteCount = 0; // 记录读取进度 int pos = 0; // 记录截取位置 if (byteLen > len) { for (int i = 0; i < charLen; i++) { if (Convert.ToInt32(str.ToCharArray()[i]) > 255) // 按中文字符计算加 2 { byteCount += 2; } else // 按英文字符计算加 1 { byteCount += 1; } if (byteCount > len) // 超出时只记下上一个有效位置 { pos = i; break; } else if (byteCount == len)// 记下当前位置 { pos = i + 1; break; } } if (pos >= 0) { result = str.Substring(0, pos); } } else { result = str; } return result; } } }
相关文章推荐
- C#获取中文英文混合字符串Byte字节长度
- C#获取中文英文混合字符串Byte字节长度
- 【C#】解决进行反序列化时出错:。InnerException 消息是“反序列化对象 属于类型 System.String 时出现错误。读取 XML 数据时,超出最大字符串内容长度配额 (8192)。
- 回复:String中如果有中文,如何保证length()返回的长度 在 Java 中字符串是以 Unicode 方式编码的,所以,无论中英文都算的长度为 1。根据你的描述,估计是想要取得英文长度为 1 中文长度为 2 的总长度吧。这个,理论上可以构造 An
- C#获取中文英文混合字符串Byte字节长度
- 超简单C#获取带汉字的字符串真实长度(单个英文长度为1,单个中文长度为2)
- String获取字符串长度--length方法
- 黄聪:C#如何通过MeasureString、Graphics获取字符串的像素长度
- C#获取字符串的长度
- C#将获取中文字符串的首个大写字母
- python获取中文字符串长度
- (转载)PHP如何获取中文字符串长度 utf8_strlen()/mb_strlen()
- JS获取字符串长度(英文占1个字符,中文汉字占2个字符)
- WCF:读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。
- JS获取字符串长度,一个中文算两个字符。
- 【手记】小心在where中使用NEWID()的大坑 【手记】解决启动SQL Server Management Studio 17时报Cannot find one of more components...的问题 【C#】组件分享:FormDragger窗体拖拽器 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed
- 获取包含中文字符串的长度、截取包含中文的字符串
- 读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。
- 如何获取含有中文字符的字符串长度
- (转载)PHP如何获取中文字符串长度 utf8_strlen()