【问题标题】:C# Random-method causes "hidden dash"C# Random-method 导致“隐藏破折号”
【发布时间】:2011-08-30 17:01:08
【问题描述】:

我正在尝试使用以下方法生成一个包含 8 个字符的随机字符串,并且效果很好,但这是 1 个小问题。

当我将字符串打印到屏幕上并将其从 IE 复制到记事本时,有时会在字符串中间添加一个破折号 (-)。这是什么原因造成的,我该如何解决?

这种情况不会经常发生,可能是 1/10 次,但仍然会弄乱字符串。

    public string generateString()
    {
        int length = 8;
        string str = "";

        string chars = "abcdefghijkmnopqrstuvwxyzABCDEFGH­JKLMNOPQRSTUVWXYZ123456789";

        int charsCount = chars.Length;
        Random random = new Random();
        for (int i = 0; i < length; i++)
        {
            str += chars[random.Next(0, charsCount)];
        }

        return str;
    }

【问题讨论】:

  • 您说“打印到屏幕”,然后“将其从 IE 复制到记事本” - 这是如何进入 IE 的?这是在某种网站框架中吗?
  • 是的,这是一个简单的 aspx 站点,我正在使用 Response.Write 将字符串打印到屏幕上
  • @user: 你能显示你的Response.Write() 行吗?另外,请尝试查看源代码,看看页面源代码中是否出现破折号?
  • 破折号不显示在页面源代码中。
  • 使用此代码在文本框中得到完全相同的奇怪破折号。请注意,这不是破折号,而是一个奇怪的 utf16 字符。真的很奇怪。

标签: c# string random


【解决方案1】:

经过一番摸索,下面这行并不是看起来的那样。在字母 H 和 J 之间还有另一个字符,#173 或 &amp;shy;,它不会在 FireFox 或 Chrome 中显示。但是IE用户可以在这里看到:

 string chars = "abcdefghijkmnopqrstuvwxyzABCDEFGH­JKLMNOPQRSTUVWXYZ123456789";

所以,要快速解决它,只需重新键入charsHJK 部分。

【讨论】:

  • 我想这就是它显示“& sh y ;”的原因在代码中,但是当你编辑它时,它不会显示出来
  • @Tim:是的,奇怪的是我似乎从这个页面复制/粘贴了它,但不能让它显示在这里。
  • @Tim,您在哪里/如何将其视为&amp;shy;
  • 经过进一步检查,IE9 显示 &s h y ;像我的截图一样处理。 Firefox 4 和 Chrome 13 没有。
  • 有趣。 IE8 清楚地显示&amp;shy;,FireFox 和Chrome 将其隐藏。也许我们应该添加一个 HTML 标签 (:
【解决方案2】:

您显示的代码不会给字符串添加任何奇怪的东西。也许是您复制和粘贴的方式导致了问题。如果它偶尔会导致问题,请查看 HTML 源代码(右键单击,查看源代码)并查看是否可以在其中看到问题。

编辑:正如 Henk 发现的那样,您的代码显然不是它看起来的全部。您的源代码中的奇怪字符是如何开始的?


话虽如此,我肯定会更改您的代码:

  • 我会让名称遵循 .NET 命名约定
  • 我会将Random 作为参数,这样您就可以快速连续多次调用它,而无需多次生成相同的字符串
  • 我会创建一个正确长度的 char 数组,填充它,然后从中创建一个新字符串,而不是使用字符串连接
  • 我会制作要生成的字符串的长度,甚至可能还有字符集参数。

只是为了说明它的外观 - 在这个示例中,我没有将字符集转换为参数,但我已经从方法中提取了它:

private const string ValidCharacters =
    "abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";

public static string GenerateString(Random random, int length)
{
    // TODO: Argument validation
    char[] chars = new char[length];
    for (int i = 0; i < chars.Length; i++)
    {
        chars[i] = ValidCharacters[random.Next(ValidCharacters.Length)];
    }
    return new string(chars);
}

【讨论】:

  • 您可以分配具有设定初始大小的字符串缓冲区,而不是使用字符数组。使用起来会更容易,但我不太确定性能差异(并且没有方便检查的反射器副本)
  • @John:使用具有给定容量的 StringBuilder 比使用最后调用构造函数的数组更容易吗?这绝对是轻而易举的事。请参阅我编辑中的示例 - 使用 StringBuilder 会比这更容易吗?
  • 显示的代码实际上确实会产生奇怪的类似破折号的字符。
  • @Henk:啊...这就是我通过阅读代码而不是检查源代码所得到的。奇怪。
  • 我从您的代码中删除了不可见的破折号并将其替换为缺少的I,这样您的代码也可以真正解决问题。
猜你喜欢
  • 1970-01-01
  • 2021-06-19
  • 2020-07-06
  • 2017-01-18
  • 2018-12-04
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
相关资源
最近更新 更多