计算包含转义字符、特殊字符和格式化的字符串长度

3
我需要能够读取字符串的实际长度。
例子:
- "\t" 的长度为 4。 - "\t foobar" 的长度为 11。 - String.Format("\t {0, -15}", "Hello World") 的长度为 20。
如果我只需要处理制表符和空格,那么编写解码器就很容易了,但对于第三个例子,我不知道该如何处理。有没有办法在C#中强制让一个字符串自我解释?
谢谢。

3
对于第三个示例,使用这些参数调用String.Format,然后使用制表符测量字符串长度(如果您假设制表符为四个空格,则不要忘记"a \t"和"\t"都是四个字符)。当然,在那个分支中,您要寻找的制表符将是实际的制表符字符,而不是反斜杠后跟小写字母"t"。另一种选择是重新实现String.Format,但这是疯狂的。"强制字符串自我解释"的方法是使用String.Format - 15ee8f99-57ff-4f92-890c-b56153
3
\t 的长度始终为1,但如果特定程序将其输出到显示器上,则会呈现不同的显式长度。例如,NotePad使用8个列宽来表示制表符;LINQPad 使用 3 个列宽;Visual Studio 使用 4 个列宽;而 Microsoft Word 使用 0.5 英寸的列宽。因此,问题是你正在针对哪种显示屏计算有效长度?如果你只关心制表符(并且它总是在开头,并假设为4个字符的制表符),那么简单的解决方案是 "the string".Replace("\t", "    ").Length - mellamokb
2
命令提示符是我正在使用的显示器。我认为一个制表符等于四个空格。我目前的解决方案是使用String.Replace,但我想知道是否有更好的方法。我的当前要求只是制表符,但不能保证这不会改变。 - Unome
1
我认为您在根本上混淆了字符串的本质和程序如何显示字符串。字符串是一组字符。由于在大多数IDE中正确键入TAB字符很困难,因此我们通过“转义序列”\t表示它。但它在底层是字符#9(TAB字符),并且始终为一个字符。包含TAB字符的字符串长度为1个字符。在向终端显示字符串时,某些软件程序遇到字符#9时会仅仅发出四个空格,这纯粹是约定俗成的。 - mellamokb
1
@mellamokb 你说得对,制表符是一个独立的字符,IDE和编写它的程序会将其打印为一定数量的空格。我之前没有意识到这一点。谢谢。 - Unome
显示剩余2条评论
1个回答

2
如果你想让"\t"等于4个空格,为什么不将所有的"\t"替换成4个空格呢?类似这样:
public static void Main(string[] args)
{
    Console.WriteLine(GetLength("\t"));
    Console.WriteLine(GetLength("\t foobar"));
    Console.WriteLine(GetLength(String.Format("\t {0, -15}", "Hello World")));
    Console.WriteLine(GetLength("a\t"));
    Console.ReadLine();
}

private static int GetLength(string str)
{
    return str.Replace("\t", "    ").Length;
}

结果:

4
11
20
5

这与我目前用来解决问题的方法类似,我仍然好奇是否有内置于String类中或者某个C#库中的东西可以给出解释(我一直找不到任何东西),但如果没有,那么这就是做法。 - Unome
没有这样的规定,即\t等于4个空格 - 它可能更多或更少,或者完全是其他东西。 - Dan Field
我原本希望会有一些默认值被使用,但我认为你是对的,因为 \t 是一个变量值,所以这些转义字符没有默认的解释器。 - Unome
制表符(\t)是一种格式化或者显示字符。也就是说,其作用完全取决于解释它的应用程序。是的,Visual Studio和记事本都使用4个空格作为制表符,但有些程序使用6个、2个甚至1个空格! - Der Kommissar
不确定这是个好主意,因为在你的最后一次测试中,我认为答案应该是4。制表符往往是可调整的,而不仅仅是固定的4个字符。 - Sauleil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接