首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成随机字符串

生成随机字符串
EN

Stack Overflow用户
提问于 2012-08-26 13:30:05
回答 2查看 2.6K关注 0票数 6

我试图在.NET中生成一个随机字符串并将其转换为字节,但遇到了一些困难。我想要全套可能的字符,我的理解是一个字符串可以包含任何字符。

我的代码目前如下:

代码语言:javascript
复制
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,但它们给我带来了同样的问题。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-26 13:36:30

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

您可以选择将它们过滤掉(例如,在获得非代理角色之前调用_random.Next ),也可以在生成代理角色时生成合法的代理对。

票数 9
EN

Stack Overflow用户

发布于 2012-08-26 13:37:45

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

您似乎在假设字符和代码点是同一件事的基础上进行操作。这不是真的,有超过2^16个代码点。

我推荐阅读UTF-16 Wikipedia Article

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12127843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档