将字节数组转换为字符串再转回字节数组会损坏数据。

4

有人能告诉我这里发生了什么吗?

        byte[] stamp = new byte[]{0,0,0,0,0,1,177,115};
        string serialize = System.Text.Encoding.UTF8.GetString(stamp);
        byte[] deserialize = System.Text.Encoding.UTF8.GetBytes(serialize);

        //deserialize == byte[]{0,0,0,0,0,1,239,191,189,115}

为什么 stamp != deserialize?

1
你确定它们不是同一个字符串吗?编码不需要保留原始字节... - Adriano Repetti
它们可能是相同的字符串,但我正在使用SQL时间戳,所以我关心的是字节,而不是字符串... - sǝɯɐſ
2个回答

5
在你的原始字节数组中,你有一个字符177,它代表加减号。但是在序列化过程中,该代码没有被识别。它被替换为239 191 189,这是替换字符。这里提供了一个参考表格:http://www.utf8-chartable.de/unicode-utf8-table.pl?start=65280&utf8=dec
我不太确定为什么加减号未被识别,但这就是字节数组不相等的原因。除此之外,它们是相等的,数据没有被破坏。

1
好问题,它让我思考并查阅相关资料。这是一个有趣的问题! - Eric Wich

4
字节数组在UTF-8中没有编码为有效的文本字符串,所以当你"序列化"它时,不能被识别的部分会被替换为"替换字符"。如果你必须将字节数组转换为字符串,应该找到一个没有像这样限制的编码,比如ISO-8859-1。
尤其是字节177不能单独出现在有效的UTF-8中:范围在128-191的字节是"连续字节",只能在194-244范围内的字节之后出现。你可以在这里了解更多关于UTF-8的知识:https://en.wikipedia.org/wiki/UTF-8

这个表格 http://www.utf8-chartable.de/unicode-utf8-table.pl?start=128&utf8=dec 是什么意思? - Cédric Bignon
1
这似乎是一个Unicode字符表,包含从U+0080到U+017F的字符,以及它们在UTF-8中的编码和含义。例如,U+00F8被称为LATIN SMALL LETTER O WITH STROKE,在UTF-8中编码为(195, 184),看起来像这样:ø。 - Joni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接