【问题标题】:Why "K".Length gives me wrong result?为什么 "K".Length 给我错误的结果?
【发布时间】:2013-03-09 11:31:54
【问题描述】:

我看到了这个奇怪的问题,在网络上的任何地方都找不到类似的东西:

int l = "K".Length;    //This actually returns 2 !!! The 'Autos' window in
                       //the debugger also shows "K".Length as 2.

string s = "K";
l = s.Length;          //Whereas this returns 1 as expected

我在各种 C# 项目中尝试过这个,甚至要求另一位开发人员确认在不同机器上的不同项目中的行为是相同的。

我在 VB.NET 中也尝试过:

Dim l As Integer = "K".Length    'This returns 1 correctly

我会失去它吗?

【问题讨论】:

  • 调试器的 quickwatch 的 "K".Length 显示 1。
  • 调试器的即时"K".Length 显示1。
  • 我认为你正在失去它。您的字符串长度为 2 的原因是它包含两个字符。
  • 第一个例子中K前面不是空格吗? :)
  • 您希望第一个带有特殊字符的返回 1?

标签: c# string string-length


【解决方案1】:

您的“K”实际上包含两个字符。一个“K”和另一个 unicode 不可见符号。当我清楚地输入"-K-"时它显示1,当我复制粘贴你的代码时,它是2。粘贴两次,它会是4。

【讨论】:

    【解决方案2】:

    这是因为“K”与“K”不同,其中有一个不可见的字符,即 ascii 值 30(记录分隔符)。

    您可以通过这样做来验证这一点

    byte[] bytes = Encoding.ASCII.GetBytes("K");
    

    【讨论】:

    • 现在的问题是,这个神奇的“K”是怎么出现的?
    • 我认为区别在于谁复制粘贴了代码示例,以及谁自己输入...
    • 是的,你是对的!我正要发布同样的内容。我相信当我从一些 .txt 日志文件中复制一些文本以在代码中构建通信数据包的一部分时,问题就出现了。老实说,我认为 Visual Studio 编辑器只允许在粘贴时打印可打印的文本——我相信这是有道理的……现在我知道它也接受不可打印的字符。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 2021-12-22
    • 2022-01-15
    相关资源
    最近更新 更多