我试图在.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,但是它们给了我同样的问题。

有什么想法吗?

最佳答案

问题在于,0xD800-0xDFFF(55296-57343)范围内的字符(称为Unicode替代字符)本身无效。为了有效(在UTF-16编码方案中),它们必须成对出现(第一个为0xD800-0xDBFF,第二个为0xDC00-0xDFFF)。单独将它们视为无效字符并解码为0xFFFD(65533)。 C#使用UTF-16表示其字符串,因此这就是您看到该输出的原因。

您可以选择将其过滤掉(例如,调用_random.Next直到获得非代理字符),或者在生成代理字符时生成合法的代理对。

10-05 21:14
查看更多