生成随机字符串

时间:2012-08-26 05:30:05

标签: c# .net string unicode encoding

我正在尝试在.NET中生成一个随机字符串并转换为字节,并遇到一点困难。我想要完整的可能字符集,我的理解是字符串可以包含任何字符。

我的代码目前如下:

var plainText = new StringBuilder();
for (int j = 0; j < stringLength; ++j)
{
    plainText.Append((char)_random.Next(char.MinValue, char.MaxValue));
}
byte[] x = Encoding.Unicode.GetBytes(plainText.ToString());
string result = Encoding.Unicode.GetString(x);

理论上,plainTextresult应该相同。它们大致相同,但是一些原始字符丢失了,似乎是55000-57000范围内的字符 - 它们被字符65533替换。

我假设问题出在我的编码上,但我认为Unicode可以正确处理。我尝试过UTF8和UTF32,但那些给我带来同样的问题。

有什么想法吗?

2 个答案:

答案 0 :(得分:8)

问题是0xD800-0xDFFF(55296-57343)范围内的字符(称为Unicode代理字符)本身无效。它们必须成对出现(首先是0xD800-0xDBFF,第二个是0xDC00-0xDFFF)才能生效(在UTF-16编码方案中)。单独,它们将被视为无效字符并解码为0xFFFD(65533)。 C#使用UTF-16来表示它的字符串,这就是你看到输出的原因。

您可以选择过滤掉它们(例如,在获得非代理字符之前调用_random.Next),或者在生成代理字符时生成合法代理项对。

答案 1 :(得分:2)

这些是替代字符55296-57343(0xD800-0xDFFF)。你需要正确配对它们。 UTF-16中的一对代理字符描述了单个unicode代码点。

您似乎在假设char和代码点是相同的事情的情况下运行。这不是真的,有> 2 ^ 16个代码点。

我建议您阅读UTF-16 Wikipedia Article