关于c#:Encoding.UTF8.GetString和Encoding.UTF8.GetBytes彼此不相反的原因是什么?

What is the reason that Encoding.UTF8.GetString and Encoding.UTF8.GetBytes are not inverse of each other?

可能我遗漏了一些东西,但我不明白为什么encoding.utf8.getString和encoding.utf8.getBytes不能互相进行反向转换?

在下面的示例中,myoriginalbytes和asbytes不相等,即使它们的长度不同。有人能解释一下我遗漏了什么吗?

1
2
3
byte[] myOriginalBytes = GetRandomByteArray();
var asString = Encoding.UTF8.GetString(myOriginalBytes);
var asBytes = Encoding.UTF8.GetBytes(asString);

如果从一个有效的UTF-8字节序列开始,它们是相反的,但是如果只是从一个任意的字节序列开始,它们就不是了。

让我们举一个具体且非常简单的例子:单字节,0xFF。这不是任何文本的有效UTF-8编码。如果你有:

1
2
byte[] bytes = { 0xff };
string text = Encoding.UTF8.GetString(bytes);

…最后,您会发现text是一个单独的字符,u+fffd,"unicode替换字符",用于指示对二进制数据解码时出错。对于任何无效的序列,您将以该替换字符结束—例如,如果以0x80开始,您将得到相同的文本。显然,如果将多个二进制输入解码为同一文本输出,则它不可能是完全可逆的转换。

如果您有任意的二进制数据,则不应该使用Encoding从中获取文本—您应该使用Convert.ToBase64String或hex。Encoding用于自然文本的数据。

如果你往相反的方向走,就像这样:

1
2
3
string text = GetRandomText();
byte[] bytes = Encoding.UTF8.GetBytes(text);
string text2 = Encoding.UTF8.GetString(bytes);

…我希望text2text相等,但奇数情况除外,其中您有无效的文本开始,例如"半"个代理对。