2012-08-26 23 views
5

Estoy tratando de generar una cadena aleatoria en .NET y convertirla a bytes, y ejecutarla con un poco de dificultad. Me gustaría el conjunto completo de caracteres posibles, y tengo entendido que una cadena puede contener cualquier carácter.Generando una cadena aleatoria

Mi código es actualmente de la siguiente manera:

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

En teoría, plainText y result deben ser idénticos. En su mayoría son iguales, pero algunos de los caracteres originales se pierden, parecen ser caracteres del rango 55000-57000; se reemplazan con el carácter 65533.

Supongo que el problema está en mi codificación, pero pensé que Unicode manejaría esto correctamente. He probado UTF8 y UTF32, pero esos me dan el mismo problema.

¿Alguna idea?

+0

extraño ?! Unicode podría ser, pero cuando lo probaste con utf-32 ?! – TheHe

+1

¿Qué estás tratando de lograr? – CodesInChaos

+0

Supongo que está produciendo una cadena UTF-16 no válida con caracteres sustitutos no pareados. – CodesInChaos

Respuesta

8

El problema es que los caracteres en el rango 0xD800-0xDFFF (55296-57343), llamados caracteres sustitutos Unicode, no son válidos por sí solos. Deben aparecer como un par (0xD800-0xDBFF primero, 0xDC00-0xDFFF segundo) para que sean válidos (en el esquema de codificación UTF-16). Solo, se tratarán como caracteres no válidos y se decodificarán a 0xFFFD (65533). C# usa UTF-16 para representar sus cadenas, por eso está viendo esa salida.

Puede optar por filtrarlos (por ejemplo, llamando al _random.Next hasta que obtenga un carácter no suplente), o generar pares alternativos legales cada vez que genere un personaje sustituto.

+0

Impresionante, gracias. No había tratado con personajes sustitutos antes. –

2

Esos caracteres sustitutos 55296-57343 (0xD800-0xDFFF). Necesitas emparejarlos correctamente. Un par de caracteres sustitutos en UTF-16 describe un solo punto de código Unicode.

Parece que opera bajo el supuesto de que un carácter y un punto de código son la misma cosa. Eso no es cierto, hay> 2^16 puntos de código.

Recomiendo leer el UTF-16 Wikipedia Article.