2012-08-26 11 views
5

Sto provando a generare una stringa casuale in .NET e convertire in byte, e in esecuzione in una piccola difficoltà. Mi piacerebbe la serie completa di possibili personaggi, e la mia comprensione è che una stringa può contenere qualsiasi personaggio.Generazione di una stringa casuale

Il mio codice è attualmente la seguente:

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); 

In teoria, plainText e result dovrebbero essere identici. Sono quasi tutti uguali, ma alcuni dei personaggi originali sono persi, sembra essere un personaggio della gamma 55000-57000 - sono sostituiti con il carattere 65533.

Sto assumendo che il problema sia con la mia codifica, ma ho pensato che Unicode avrebbe gestito correttamente questo. Ho provato UTF8 e UTF32, ma quelli mi danno lo stesso problema.

Qualche idea?

+0

strano ?! unicode potrebbe essere, ma quando lo hai testato con utf-32 ?! – TheHe

+1

Cosa stai cercando di ottenere? – CodesInChaos

+0

Suppongo che tu stia producendo una stringa UTF-16 non valida con caratteri surrogati non accoppiati. – CodesInChaos

risposta

8

Il problema è che i caratteri nell'intervallo 0xD800-0xDFFF (55296-57343), chiamati caratteri surrogati Unicode, non sono validi da soli. Devono apparire come una coppia (0xD800-0xDBFF prima, 0xDC00-0xDFFF secondo) per essere validi (nello schema di codifica UTF-16). Da soli, verranno trattati come caratteri non validi e decodificati su 0xFFFD (65533). C# usa UTF-16 per rappresentare le sue stringhe, quindi è per questo che stai vedendo quell'output.

È possibile scegliere di filtrarli (ad esempio chiamando _random.Next finché non si ottiene un carattere non surrogato) o generare coppie surrogate legali ogni volta che si genera un carattere surrogato.

+0

Fantastico, grazie. Non avevo mai trattato con personaggi surrogati prima. –

2

Questi sono caratteri surrogati 55296-57343 (0xD800-0xDFFF). Devi abbinarli correttamente. Una coppia di caratteri surrogati in UTF-16 descrive un singolo punto di codice unicode.

Sembra che si operi sul fatto che un char e un punto di codice sono la stessa cosa. Non è vero, ci sono> 2^16 punti di codice.

Consiglio di leggere lo UTF-16 Wikipedia Article.

Problemi correlati