c# - 将字节转换为 ISO 8859-1 编码时,空字节会发生什么情况?

标签 c# encoding id3 iso-8859-1

我不确定这个问题是否有意义。我正在转换一个取自 ID3 标记的字节数组并将其转换为字符串。 ID3 标签中的大多数文本框架使用 ISO 8859-1 编码,但这取决于框架。在任何情况下,如果您在 ISO 8859-1 代码中查找 0x00 是什么,它都是无效的。

更复杂的是,由于程序员错误或格式不当,一些字符串以 0x00 结尾,而另一些则不是。

当使用 ISO 8859-1 编码将一系列字节转换为字符串时,您是否手动检查字符串的结尾以查看它是否为空?还是编码对象首先通过它用于转换的任何方法正确处理空值?此外,是否有某种函数可以规范化或“修复”空终止字符串?

当您尝试显示这些字符串时,它们无法正确显示。

我正在为这个特定项目使用 C#。 这里有一些关于 ID3 标签的额外信息:ID3 Specs

还是我完全误解了整件事?空终止符只是特定语言处理字符串的一种方式,与编码无关吗?

  • 编辑:我使用了 System.Text.Encoding.GetEncoding("iso-8859-1") 然后调用了 GetString

最佳答案

如果您使用 Encoding.GetEncoding(28591),它只是将字节 0 转换为 Unicode U+0000。编码通常假设它们必须转换所有字节 - 它们不寻找终止符。

将 0 作为 Unicode 0 处理与 Wikipedia description 内联:

In 1992, the IANA registered the character map ISO_8859-1:1987, more commonly known by its preferred MIME name of ISO-8859-1 (note the extra hyphen over ISO 8859-1), a superset of ISO 8859-1, for use on the Internet. This map assigns the C0 and C1 control characters to the unassigned code values thus provides for 256 characters via every possible 8-bit value.

C0和C1控制字符页面包括:

0: Originally used to allow gaps to be left on paper tape for edits. Later used for padding after a code that might take a terminal some time to process (e.g. a carriage return or line feed on a printing terminal). Now often used as a string terminator, especially in the C programming language.

示例代码:

using System;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        byte[] data = { 0, 0 };
        Encoding latin1 = Encoding.GetEncoding(28591);

        string text = latin1.GetString(data);
        Console.WriteLine(text.Length); // 2
        Console.WriteLine((int) text[0]); // 0
        Console.WriteLine((int) text[1]); // 0
    }
}

关于c# - 将字节转换为 ISO 8859-1 编码时,空字节会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6654517/

相关文章:

c# - 我不能将动态与可移植类库一起使用吗?

c# - 正则表达式来捕获 img 标签,两个版本

c# - 如何检查图中的简单连通性?

python - PIL 剪贴板图像到 Base64 字符串

java - 以编程方式更改 id3 标签版本(首选 java)

java - J2ME 从 Walkman(索尼爱立信)读取 ID3 标签

c# - 有没有一种方法可以同步运行 C# 任务并在一行代码中获得结果?

Apache 8.5 拒绝编码的 url

encoding - 内置的UnicodeDecodeError : 'utf-8' codec can't decode byte 0xd2 in position 17: invalid continuation byte

java - 如何为 Java 剪辑使用 ID3 标记(音频文件详细信息和信息)