2012-08-26 24 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

strange ?!ユニコードは可能かもしれませんが、あなたがutf-32でテストしたときに! – TheHe

+1

あなたは何を達成しようとしていますか? – CodesInChaos

+0

私はあなたが対になっていないサロゲート文字で無効なUTF-16文字列を生成していると仮定します。 – CodesInChaos

答えて

8

問題は、Unicodeサロゲート文字と呼ばれる0xD800-0xDFFF(55296-57343)の範囲内の文字は、単独では無効です。 (UTF-16エンコード方式で)有効にするには、ペアとして表示する必要があります(0xD800-0xDBFF最初、0xDC00-0xDFFF秒)。単独では、無効な文字として扱われ、0xFFFDにデコードされます(65533)。 C#では文字列を表すためにUTF-16を使用しているため、その出力が表示されます。

サロゲート文字を生成するたびにフィルタリングするか(サロゲート以外の文字が得られるまで_random.Nextを呼び出すなど)、正規のサロゲートペアを生成するかを選択できます。

+0

素晴らしいです、ありがとうございます。私は前に代理人を扱っていなかった。 –

2

これらは代用文字55296-57343(0xD800-0xDFFF)です。それらを正しくペアにする必要があります。 UTF-16のサロゲート文字のペアは、単一のUnicodeコードポイントを表します。

charとcode-pointが同じものであることを前提に動作しているようです。それは当てはまりません、2^16以上のコードポイントがあります。

UTF-16 Wikipedia Articleを読むことをお勧めします。

関連する問題