解决.net中截取字符串的汉字与数字还有静态扩展方法

转载 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:

  1. //扩展方法必须在非泛型静态类中定义
  2. public static class qzwtest
  3. {
  4. //扩展方法
  5. public static string[] qzw(this string str)
  6. {
  7. return str.Split(new char[] { ‘ ‘, ‘,‘ });
  8. }
  9. }
  10. class Program
  11. {
  12. static int Main()
  13. {
  14. string testStr = "钱卓文 is 喵喵,贤静";
  15. //调用扩展方法
  16. string[] testArray = testStr.qzw();
  17. foreach (string s in testArray)
  18. {
  19. Console.WriteLine(s);
  20. }
  21. Console.ReadKey();
  22. return 0;
  23. }
  24. }
时间: 2024-12-29 12:59:15

解决.net中截取字符串的汉字与数字还有静态扩展方法的相关文章

SQL Server中截取字符串常用函数

SQL Server 中截取字符串常用的函数: 1.LEFT ( character_expression , integer_expression ) 函数说明:LEFT ( '源字符串' , '要截取最左边的字符数' ) 返回从字符串左边开始指定个数的字符 select LEFT('SQL_Server_2008',4 ); 返回结果:SQL_ 2.RIGHT ( character_expression , integer_expression ) 函数说明:RIGHT ( '源字符串'

shell中截取字符串的方法总结

shell中截取字符串的方法有很多种, ${expression}一共有9种使用方法. ${parameter:-word} ${parameter:=word} ${parameter:?word} ${parameter:+word} 上面4种可以用来进行缺省值的替换. ${#parameter} 上面这种可以获得字符串的长度. ${parameter%word} 最小限度从后面截取word ${parameter%%word} 最大限度从后面截取word ${parameter#word}

linux 中截取字符串

shell中截取字符串的方法有很多中,${expression}一共有9种使用方法.${parameter:-word}${parameter:=word}${parameter:?word}${parameter:+word} 上面4种可以用来进行缺省值的替换.${#parameter}上面这种可以获得字符串的长度. ${parameter%word} 最小限度从后面截取word${parameter%%word} 最大限度从后面截取word${parameter#word} 最小限度从前面截

Word中截取部分内容并保存为jpg图片的方法

private void button1_Click(object sender, EventArgs e) { var appWord = new Microsoft.Office.Interop.Word.Application(); var doc = new Microsoft.Office.Interop.Word.Document(); object oMissing = System.Reflection.Missing.Value;//这个是什么东西,我始终没搞明白-_- //打

Python2中print字符串含有汉字无法正常显示

demo1 Ubuntu16,Python2,且安装过中文语言什么的. #!usr/bin/python# -*- coding: utf-8 -*-a = "我就是中文啊"print("a:",a)1234 输出就是: ('a:', '\xe6\x88\x91\xe5\xb0\xb1\xe6\x98\xaf\xe4\xb8\xad\xe6\x96\x87\xe5\x95\x8a')1 各种尝试,encode和decode,都不行!咦,为啥呢? 后来才知道,Pyth

sql语句中截取字符串

今天在开发过程中因为要用到合并单元格,在程序里实现了以后,查出来的数据太长,都把格式撑大了,后来想想可以在sql语句查询的时候就截取,就去网上找了一下,挺好用,就转了过来: 合并单元格: /// <summary>    /// 合并GridView中某列相同信息的行(单元格)    /// </summary>    /// <param name="GridView1">GridView</param>    /// <para

js截取字符串区分汉字字母代码

js截取字符串并且区分汉字字母,一个汉字辨别为两个字节. function substr(str, len) { if (!str || !len) { return ''; } // 预期计数:中文2字节,英文1字节 var a = 0; // 循环计数 var i = 0; // 临时字串 var temp = ''; for (i = 0; i < str.length; i++) { if (str.charCodeAt(i) > 255) { // 按照预期计数增加2 a += 2;

Qt判断QString中的字符串是否为纯数字

/*** *判断一个字符串是否为纯数字 */ int Common::isDigitStr(QString src) { QByteArray ba = src.toLatin1();//QString 转换为 char* const char *s = ba.data(); while(*s && *s>='0' && *s<='9') s++; if (*s) { //不是纯数字 return -1; } else { //纯数字 return 0; } }

java中截取字符串的方式

1.length() 字符串的长度 例:char chars[]={'a','b'.'c'}; String s=new String(chars); int len=s.length(); 2.charAt() 截取一个字符 例:char ch; ch="abc".charAt(1); 返回'b' 3.getChars() 截取多个字符 void getChars(int sourceStart,int sourceEnd,char target[],int targetStart)