为什么将一种编码中的字节转换为不同编码中的字符串时需要 Encoding.Convert?
Why is Encoding.Convert needed when converting bytes in one encoding to a string in a different Encoding?
以下代码展示了如何将一种编码的字节转换为另一种编码的字符串:
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
将其结果字节解释为每个字符一个字节而不是每个字符多个字节吗?我想我没有看到字节数组如何从一种编码转换为另一种编码,因为字节数组的元素没有被修改(即转换后的字节数组的长度没有改变)。
考虑字符串 Tèst
.
它的 UTF-8 表示是(十六进制):
54 C3 A8 73 74
T è s t
它的 ISO-8859-1 是(十六进制):
54 E8 73 74
T è s t
您可以注意到 è
的表示方式之间的差异。
所以我们知道每种编码都可以使用不同的字节来表示某个字符。
所以如果你有字节 C3 A8
你知道它们代表字符 è
只是因为你知道它是用 UTF-8 编码的。
以下代码展示了如何将一种编码的字节转换为另一种编码的字符串:
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
将其结果字节解释为每个字符一个字节而不是每个字符多个字节吗?我想我没有看到字节数组如何从一种编码转换为另一种编码,因为字节数组的元素没有被修改(即转换后的字节数组的长度没有改变)。
考虑字符串 Tèst
.
它的 UTF-8 表示是(十六进制):
54 C3 A8 73 74
T è s t
它的 ISO-8859-1 是(十六进制):
54 E8 73 74
T è s t
您可以注意到 è
的表示方式之间的差异。
所以我们知道每种编码都可以使用不同的字节来表示某个字符。
所以如果你有字节 C3 A8
你知道它们代表字符 è
只是因为你知道它是用 UTF-8 编码的。