Joe*_*nos 5 .net c# 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);
Run Code Online (Sandbox Code Playgroud)
从理论上讲,plainText并result应该是相同的.它们大致相同,但是一些原始字符丢失,似乎是55000-57000范围内的字符 - 它们被替换为字符65533.
我假设问题与我的编码有关,但我认为Unicode会正确处理这个问题.我试过UTF8和UTF32,但那些给我同样的问题.
有什么想法吗?
问题是0xD800-0xDFFF(55296-57343)范围内的字符(称为Unicode代理字符)本身无效.它们必须成对出现(首先是0xD800-0xDBFF,0xDC00-0xDFFF秒)才能生效(在UTF-16编码方案中).单独,它们将被视为无效字符并解码为0xFFFD(65533).C#使用UTF-16来表示它的字符串,这就是你看到输出的原因.
您可以选择过滤它们(例如,_random.Next在您获得非代理字符之前调用),或者在生成代理字符时生成合法代理项对.
| 归档时间: |
|
| 查看次数: |
2043 次 |
| 最近记录: |