2012-08-26 21 views
5

Ich versuche, eine zufällige Zeichenfolge in .NET zu generieren und in Bytes zu konvertieren, und in eine kleine Schwierigkeit zu laufen. Ich hätte gerne den vollen Satz möglicher Zeichen und mein Verständnis ist, dass eine Zeichenfolge ein beliebiges Zeichen enthalten kann.Erzeugen einer zufälligen Zeichenfolge

Mein Code ist zur Zeit wie folgt:

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

Theoretisch plainText und result sollten identisch sein. Sie sind größtenteils gleich, aber einige der ursprünglichen Zeichen sind verloren, scheint Zeichen im Bereich 55000-57000 zu sein - sie werden durch Zeichen 65533 ersetzt.

Ich nehme an, das Problem ist mit meiner Codierung, aber ich dachte, Unicode würde damit richtig umgehen. Ich habe UTF8 und UTF32 versucht, aber diese geben mir das gleiche Problem.

Irgendwelche Gedanken?

+0

seltsam ?! Unicode könnte sein, aber wenn du es mit utf-32 getestet hast ?! – TheHe

+1

Was versuchen Sie zu erreichen? – CodesInChaos

+0

Ich nehme an, dass Sie eine ungültige UTF-16-Zeichenfolge mit ungepaarten Ersatzzeichen produzieren. – CodesInChaos

Antwort

8

Das Problem ist, dass die Zeichen im Bereich 0xD800-0xDFFF (55296-57343), so genannte Unicode-Ersatzzeichen, nicht einzeln gültig sind. Sie müssen als Paar (0xD800-0xDBFF zuerst, 0xDC00-0xDFFF Sekunde) angezeigt werden, damit sie gültig sind (im UTF-16-Codierungsschema). Alleine werden sie als ungültige Zeichen behandelt und zu 0xFFFD (65533) dekodiert. C# verwendet UTF-16, um seine Strings darzustellen, deshalb sehen Sie diese Ausgabe.

Sie können sie entweder ausfiltern (z. B. _random.Next aufrufen, bis Sie ein Ersatzzeichen erhalten) oder legale Ersatzpaare generieren, wenn Sie ein Ersatzzeichen generieren.

+0

Super, danke. Ich hatte mich noch nicht mit Ersatzfiguren beschäftigt. –

2

Dies sind Ersatzzeichen 55296-57343 (0xD800-0xDFFF). Sie müssen sie richtig paaren. Ein Paar Ersatzzeichen in UTF-16 beschreibt einen einzelnen Unicode-Codepunkt.

Sie scheinen auf der Annahme zu beruhen, dass ein Char und ein Codepunkt identisch sind. Das stimmt nicht, es gibt> 2^16 Codepunkte.

Ich empfehle das Lesen der UTF-16 Wikipedia Article.

Verwandte Themen