首页 > 解决方案 > 为什么在将一种编码中的字节转换为不同编码中的字符串时需要 Encoding.Convert?

问题描述

以下代码显示了如何将一种编码中的字节转换为另一种编码中的字符串:

   byte[] utf8Bytes = File.ReadAllBytes(file)
   Encoding utf8 = Encoding.UTF8
   Encoding iso88591 = Encoding.GetEncoding("ISO-8859-1")
   byte[] iso88591Bytes = Encoding.Convert(utf8, iso88591, utf8Bytes)
   string iso88591Text = iso88591.GetString(iso88591Bytes)

我不明白为什么在Encoding.Convert从一种编码中的字节转换为另一种编码中的字符串时需要该语句,因为无论哪种编码,一个字节都是一个字节。我的意思是为什么不能将 UTF8 字节直接解码为 ISO-8859-1 字符串,而不是使用Encoding.Convert将整个字节数组从一种编码转换为另一种编码的中间体?像这样:

  byte[] utf8Bytes = File.ReadAllBytes(file)
  Encoding utf8 = Encoding.UTF8
  Encoding iso88591 = Encoding.GetEncoding("ISO-8859-1")
  string iso88591Text = iso88591.GetString(utf8bytes)

可能是我遗漏了一些东西,是否Encoding.Convert(utf8, iso88591, utf8Bytes)需要Encoding.GetString将其结果字节解释为每个字符的单个字节而不是每个字符的多字节?我想我看不到如何将字节数组从一种编码转换为另一种编码,因为字节数组的元素没有被修改(即转换后的字节数组的长度不会改变)。

标签: c#encodingutf-8character-encodingiso-8859-1

解决方案


考虑字符串Tèst

它的 UTF-8 表示是(十六进制):

54 C3 A8 73 74
T    è   s  t

它的 ISO-8859-1 是(十六进制):

54 E8 73 74
T  è  s  t

您可以注意到表示方式之间的差异è

所以我们知道每种编码都可以使用不同的字节来表示某个字符。

因此,如果您有字节C3 A8,那么您知道它们代表 charè只是因为您知道它是用 UTF-8 编码的。


推荐阅读