转载 http://blog.163.com/cn_dreamgo/blog/static/52679452200961033212407/
这两天在C#编程中应用到C#代码与C的代码信息交互,但是在信息获取的过程发现当字符串中存在中文汉字时,两种代码下获取的字符串长度不相同。查找原因为:C#中使用的unicode编码格式,默认一个汉字为一个字符。例如:
str1 = "测试";
在C#中使用str1.length的到的长度是2,在C中strlen()得到的长度是4;这样在字符长处理中就遇到了问题。
在C编写的程序中传输一段中英文混合的固定长度20字节的字符串给C#编写的程序,不足的位数补空字符。当在C#中进行字符串截取时,由于存在汉字问题,导致截取位数出现错误,获取的信息也同样错误。
C传输字符串:"A这是一个测试代码段 B这是测试代码段2 C这是测试代码段3 "
C#中要截取得到每段字符串,使用str.Substring(0,20) 得到字符串是:"A这是一个测试代码段 B这是测试代码段2"而不是所需要"A这是一个测试代码段 "。
为此,我编写了下面的小函数来代替原来的Substring实现获取从指定位置开始指定长度的字符段。
///
/// 获取字符串中指定位置开始的指定长度的字符串,支持汉字英文混合 汉字为2字节计数
///
/// 输入中英混合字符串
/// 开始截取的起始位置
/// 要截取的字符串长度
///
public static HtmlString SubNick(string strSub, int start, int length)
{
string temp = strSub;
int j = 0, k = 0, p = 0;
CharEnumerator ce = temp.GetEnumerator();
while (ce.MoveNext())
{
j += (ce.Current > 0 && ce.Current < 255) ? 1 : 2;
if (j <= start)
{
p++;
}
else
{
if (j == GetLength(temp))
{
temp = temp.Substring(p, k + 1);
break;
}
if (j <= length + start)
{
k++;
}
else
{
temp = temp.Substring(p, k);
break;
}
}
}
return new HtmlString(temp);
}
///
/// 获取指定字符串长度,汉字以2字节计算
///
/// 要统计的字符串
///
private static int GetLength(String aOrgStr)
{
int intLen = aOrgStr.Length;
int i;
char[] chars = aOrgStr.ToCharArray();
for (i = 0; i < chars.Length; i++)
{
if (System.Convert.ToInt32(chars[i]) > 255)
{
intLen++;
}
}
return intLen;
}
==========================================================================
扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。
扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。
扩展方法的要求如下:
1 第一个参数是要扩展或者要操作的类型,这称为"被扩展的类型"
2 为了指定扩展方法,要在被扩展的类型名称前面附加this修饰符
3 要将方法作为一个扩展方法来访问,要用using指令导入扩展类型的命名空间,或者使扩展类型和调用代码在同一个命名空间中.
如果扩展方法的签名已经和被扩展类型中的一个签名匹配 扩展方法永远不会得到调用,除非是作为一个普通的静态方法
扩展方法无法帮助我们建立一个清楚的版本控制机制,因为一旦在被扩展的类型中添加一个匹配的签名,就会将现有的扩展方法覆盖,而且不会发出任何警告. 如果对被扩展的类的源代码没有控制权,这个问题还会变得更加突出 (猫的理解是很容易出现匹配冲突所导致的结果吧)
Code:
- //扩展方法必须在非泛型静态类中定义
- public static class qzwtest
- {
- //扩展方法
- public static string[] qzw(this string str)
- {
- return str.Split(new char[] { ‘ ‘, ‘,‘ });
- }
- }
- class Program
- {
- static int Main()
- {
- string testStr = "钱卓文 is 喵喵,贤静";
- //调用扩展方法
- string[] testArray = testStr.qzw();
- foreach (string s in testArray)
- {
- Console.WriteLine(s);
- }
- Console.ReadKey();
- return 0;
- }
- }