C#随机方法导致“;隐藏破折号”;

本文关键字:隐藏 破折号 随机 方法 | 更新日期: 2023-09-27 17:57:26

我试图用下面的方法生成一个包含8个字符的随机字符串,它运行得很好,但有一个小问题。

当我将字符串打印到屏幕并将其从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;
    }

C#随机方法导致“;隐藏破折号”;

您显示的代码不会向字符串添加任何奇怪的内容。也许是复制和粘贴的方式造成了问题。如果它偶尔会引起问题,请查看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);
}

稍微翻了一下,下面的行就不是看上去的样子了。在字母H和J之间还有另一个字符#173或&shy;,它在FireFox或Chrome中没有显示。但IE用户可以在这里看到:

 string chars = "abcdefghijkmnopqrstuvwxyzABCDEFGH­JKLMNOPQRSTUVWXYZ123456789";

因此,要快速解决此问题,只需重新键入charsHJK部分即可。