c# - 为什么在将一种编码中的字节转换为不同编码中的字符串时需要 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
将其结果字节解释为每个字符的单个字节而不是每个字符的多字节?我想我看不到如何将字节数组从一种编码转换为另一种编码,因为字节数组的元素没有被修改(即转换后的字节数组的长度不会改变)。
解决方案
考虑字符串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 编码的。
推荐阅读
- google-cloud-platform - 使用gcloud sdk调用云功能时如何传递消息的属性?
- vim - 在 OsX mojave 中安装 CommandT 。我收到错误 Vim Command-T 插件错误:无法加载 C 扩展
- java - 可以在Tomcat上部署springboot,但是运行时显示404
- algorithm - Heuristic 将如何影响 Dikstras 算法使其成为 A* 算法
- sitecore - 如何解决 Sitecore 计划任务在添加后 10 分钟内被跳过的问题?
- python - 如何在 Pandas 中通过 Id 将数据框的列值替换为另一个数据框值
- ruby-on-rails - 在数据表中将布尔数据字段从小写“true”转换为大写“TRUE”
- vagrant - Vagrant 2.2.3 错误:等待机器启动时超时
- excel - 宏程序不连续运行...只运行一次
- aws-lambda - 在 aws lambda 中运行 AIRFLOW