2

私がする時

string s = Encoding.Unicode.GetString(a);
byte[] aa = Encoding.Unicode.GetBytes(s);

私は異なる配列を持っています(a!= aa)。なぜですか?

しかし、私がこれをするとき?大丈夫

string s = Encoding.Default.GetString(a);
byte[] aa = Encoding.Default.GetBytes(s);
4

3 に答える 3

11

これは、逆方向のエンコードを使用しているためです。エンコーディングは、文字列をバイトにエンコードしてから、再び文字列に戻すために使用されます。

エンコーディングでは、すべての文字に対応するバイト セットがありますが、すべてのバイト セットに対応する文字が必要なわけではありません。そのため、任意のバイトを取得して文字列にデコードすることはできません。

エンコーディングを使用するDefaultと、各文字に1バイトしか使用せず、たまたますべてのバイトコードに文字があるため、そのように誤用することができます。とはいえ、そのまま使っても意味がありません。

于 2013-01-14T15:45:05.777 に答える
2

グッファの答えに追加するために、次のような特定のバイトシーケンスでコードがどのように失敗するかの詳細な例を次に示します0, 216

// Let's start with some character from the ancient Aegean numbers:
// The code point of Aegean One is U+10107. Code points > U+FFFF need two
// code units with two bytes each if you encode them in UTF-16 (Encoding.Unicode)
string aegeanOne = char.ConvertFromUtf32(0x10107);
byte[] aegeanOneBytes = Encoding.Unicode.GetBytes(aegeanOne);
// Length == 4 (2 bytes each for high and low surrogate)
// == 0, 216, 7, 221

// Let's just take the first two bytes.
// This creates a malformed byte sequence,
// because the corresponding low surrogate is missing.
byte[] a = new byte[2];
a[0] = aegeanOneBytes[0]; // == 0
a[1] = aegeanOneBytes[1]; // == 216

string s = Encoding.Unicode.GetString(a);
// == replacement character � (U+FFFD),
// because the bytes could not be decoded properly (missing low surrogate)

byte[] aa = Encoding.Unicode.GetBytes(s);
// == 253, 255 == 0xFFFD != 0, 216

string s2 = Encoding.Default.GetString(a);
// == "\0Ø" (NUL + LATIN CAPITAL LETTER O WITH STROKE)
// Results may differ, depending on the default encoding of the operating system

byte[] aa2 = Encoding.Default.GetBytes(s2);
// == 0, 216
于 2013-01-14T16:48:34.607 に答える
0

これは、byte[] aUnicode 規則に準拠していないバイト オーダーがあることを意味します。

于 2013-01-14T15:47:54.850 に答える