2012-08-26 65 views
5

我試圖在.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,但那些給我同樣的問題。

有什麼想法?

+0

奇怪?! unicode可能是,但是當你用utf-32測試它時? – TheHe

+1

你想達到什麼目的? – CodesInChaos

+0

我假設你正在生成一個帶有未配對代理字符的無效UTF-16字符串。 – CodesInChaos

回答

8

問題是0xD800-0xDFFF(55296-57343)範圍內的字符,稱爲Unicode代理字符,它們本身無效。它們必須以一對(首先爲0xD800-0xDBFF,第二個爲0xDC00-0xDFFF)的形式出現才能生效(採用UTF-16編碼方案)。單獨,它們將被視爲無效字符並解碼爲0xFFFD(65533)。 C#使用UTF-16來表示它的字符串,所以這就是爲什麼你看到了這個輸出。

您可以選擇將其過濾掉(例如,調用_random.Next,直至獲得非代理字符),或者在生成替代字符時生成合法代理對。

+0

太棒了,謝謝。我以前沒有處理過代理角色。 –

2

那些是替代字符55296-57343(0xD800-0xDFFF)。你需要正確配對它們。 UTF-16中的一對代理字符描述了一個unicode代碼點。

您似乎在假設char和代碼點是相同的情況下操作。這不是事實,有> 2^16個碼點。

我推薦閱讀UTF-16 Wikipedia Article