比如有字符串:
string1=“abcd我和你,abcd你和我,abcd你和我,abcd你和我,abcd你和我”;
string2=“asad,sdasd,asdasd,sdsds”;
我想截取半角下的前20个字符,该怎么办?也就是说在显示时输出的字符串占据的长度是一样的?
截取后的为:string2="asad,sdasd,asdasd,sd";
            string1="abcd我和你,abcd你和我";
好像因为汉字是全角的,一个占两个字符

解决方案 »

  1.   

    你的这个要求本身不复杂,但问题是字符串的编码方式多种多样,识别起来总有误差。
    如果你想达到显示时输出的效果的话有一个函数可以达到你的目的。
    首先得到你要输出的窗口的Graphics对象,然后执行MeasureString()你就可以得到一个:SizeF类型的对象了。这个对象表示了这个字符串在这个Graphics上以指定的Font输出时所占的宽度和高度。
      

  2.   

      // 字符串工具
      sealed class StrUtl
      {
        // 把一个“unicode字符串”格式化为全角字符占2个位置的“普通字符串”
        // width<0 表示左对齐,右边填空格
        // width>0 表示右对齐,左边填空格
        public static string StrFormat(string s, int width)
        {
          Encoding code = Encoding.Default;
          byte [] bs = code.GetBytes(s);
          bool leftAlign = (width < 0 ? true : false);
          if (width < 0) width = - width;
          if (bs.Length >= width) return s;
          if (leftAlign) return s.PadRight(width-bs.Length+s.Length);
          return s.PadLeft(width-bs.Length+s.Length);
        }
      }
      

  3.   

    public static string GetQiaoJiaoStringByNum(string sContent,int iNum)
    {
    //2004.10.31 Gzb 得到一句话的实际占用的“中文”字符的宽度
    // 例如:中国2004 -->4个中文宽度 (6个字),实际上这个程序是取得固定中文宽度的缩略字符串
    if(sContent==null || sContent==string.Empty || sContent.Length<iNum)
    return sContent; char[] cArray=sContent.ToCharArray();
    int iAlreadyNum=0;
    int iOkLenNum=0;
    foreach (char cH in cArray)
    {
    if(iAlreadyNum < iNum * 2)
    {
    if(cH>128)
    {
    iAlreadyNum+=2;
    }
    else
    iAlreadyNum++;
    iOkLenNum++;
    }
    else
    break;
    }
    sContent=sContent.Substring(0,iOkLenNum)+"...";
    return sContent;
    }
      

  4.   

            /// <summary>
            /// 转全角的函数(SBC case)
            /// </summary>
            /// <param name="input">任意字符串</param>
            /// <returns>全角字符串</returns>
            ///<res>
            ///全角空格为12288,半角空格为32
            ///其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248
            ///</res>        
            public static string ToSBC(string input)
            {
                //半角转全角:
                char[] c = input.ToCharArray();
                for (int i = 0; i < c.Length; i++)
                {
                    if (c[i] == 32)
                    {
                        c[i] = (char)12288;
                        continue;
                    }
                    if (c[i] < 127)
                        c[i] = (char)(c[i] + 65248);
                }
                return new string(c);
            }
            /**/
            /// <summary>
            /// 转半角的函数(DBC case)
            /// </summary>
            /// <param name="input">任意字符串</param>
            /// <returns>半角字符串</returns>
            ///<res>
            ///全角空格为12288,半角空格为32
            ///其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248
            ///</res>
            public static string ToDBC(string input)
            {
                char[] c = input.ToCharArray();
                for (int i = 0; i < c.Length; i++)
                {
                    if (c[i] == 12288)
                    {
                        c[i] = (char)32;
                        continue;
                    }
                    if (c[i] > 65280 && c[i] < 65375)
                        c[i] = (char)(c[i] - 65248);
                }
                return new string(c);
            }
      

  5.   

    同2楼,还要考虑字体的,有些字体并不是两个半角宽度等与一个全角的宽度的。
    而.NET也提供了一些测量的方法,比如Font.MeasureString   等