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

标签 c# .net utf-8

可能我遗漏了什么,但我不明白为什么 Encoding.UTF8.GetString 和 Encoding.UTF8.GetBytes 不能作为彼此的逆变换工作?

在下面的示例中,myOriginalBytes 和 asBytes 不相等,甚至它们的长度也不同。谁能解释我错过了什么?

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

最佳答案

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

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

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

...你最终会得到 text 是一个字符,U+FFFD ,“Unicode 替换字符”,用于指示解码二进制数据时出现错误。您最终会得到 任何 无效序列的替换字符 - 因此,如果您以 0x80 开头,您将得到相同的文本。显然,如果多个二进制输入被解码为相同的文本输出,则它不可能是完全可逆的转换。

如果您有任意二进制数据,您应该使用Encoding 从中获取文本 - 您应该使用Convert.ToBase64String 或者也许十六进制。 编码 用于自然文本的数据。

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

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

...我希望 text2 等于 text 除了你有无效 text 的奇怪情况开始,例如有“一半”的代理对。

关于c# - Encoding.UTF8.GetString 和 Encoding.UTF8.GetBytes 不是彼此相反的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45410219/

相关文章:

android - 如何使用 Kivy 和 Python 解决文件选择器应用程序的 UnicodeDecodeError?

c# - 在lock语句中使用匿名方法

c# - OleDb连接到 MS Access : SQL query like clause with escape characters and wildcards

c# - WP7(1) : System. 未找到 Windows.debug.resources?

java - 通过 RFC 5987 处理带空格的文件名*参数导致文件名中的 '+'

java - Spring MessageSource 基本名称路径问题

c# - 在 C# 中获取嵌套对象字段的完整路径

c# - 动态添加的 TableRows 不在 Postback 的 Rows 集合中

c# - 命名空间与类名冲突问题的优雅解决方案是什么?

c# - DateTime.ToBinary() 和 DateTime.ToFileTime() 有何不同?