本帖最后由 qq13833254607 于 2012-08-07 12:18:13 编辑

解决方案 »

  1.   

    将字符串转为字节数组,数组长度就是实际长度
    Encoding.Default.GetBytes("aa这个");
      

  2.   

    这个不行。Encoding.Default.GetByteCont()通常用来计算带中文字符串实际输出长度。
    (这其实是利用了中文显示的特点:通常的输出环境下,中文字符的输出宽度是英文的2倍。而中文的Unicode也是2字节的(英文字母是1字节)),但是'\t'是控制符,对应的也是1Byte,因此
    Encoding.Default.GetByteCount("a\tb")返回的仍然是3。
      

  3.   

    严格的说,LZ的需求其实是不能实现的。因为字符串"a\tb"实际输出的只有'a'、'\t'、'b'三个字符,其中控制符\t在ASCII中的定义为“制表符”,即“将输出位置移到下一个制表位”。而每个制表位的大小在不同的显示环境下可能会有不同的定义。例如,在cmd(严格点说应该是DOS7)和notepad下,每个制表位长度为8,而在VS的编辑器下默认的制表位长度为4。但如果只限定在控制台(DOS7)下,知道制表位长度为8以后可以自己编程计算其输出长度:
    (在下偷懒,只处理了\t的\n两种控制符,如果LZ有兴趣可以自己补充其它常见控制符如\a,\b,\r等的处理代码)
        class Program
        {
            const int TABCOUNT = 8;        static void Main(string[] args)
            {
                string s = "a\tb\nabc\t123";            Console.WriteLine(s);
                Console.WriteLine(GetOutputCount(s));
            }        static int GetOutputCount(string str)
            {
                int count = 0;            foreach (char ch in str)
                {
                    switch (ch)
                    {
                        case '\t':
                            count = TABCOUNT * (count / TABCOUNT + 1);
                            break;
                        case '\n':
                            count = 0;
                            break;
                        default:
                            count += Encoding.Default.GetByteCount(ch.ToString());
                            break;
                    }
                }            return (count);
            }
        }
      

  4.   

    仔细想了下确实实现不了,因为tab的扩展是和当前的光标位置相关的,单从一个字符串里得不到这个信息