当我这样做时
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);
答案 0 :(得分:11)
那是因为你正在向后使用编码。编码用于将字符串编码为字节,然后再次返回字符串。
在编码中,每个字符都有一组相应的字节,但不是每组字节都必须有相应的字符。这就是为什么你不能把任意字节和解码成字符串的原因。
使用编码Default
它会以这种方式滥用它,因为它只为每个字符使用一个字节,并且它恰好为每个字节代码都有一个字符。但是,以这种方式使用它仍然没有意义。
答案 1 :(得分:2)
要添加到Guffa的答案,下面是一个详细的示例,说明代码如何针对某些字节序列失败,例如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
答案 2 :(得分:0)
这意味着您的byte[] a
具有不符合Unicode规则的字节顺序。