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

use*_*293 4 c# encoding id3 iso-8859-1

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

为了进一步复杂化,无论是程序员错误还是格式化不当,一些字符串以0x00结尾,而另一些则不然.

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

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

我在这个特定项目中使用C#.关于ID3的一些额外信息标签:ID3规格

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

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

Jon*_*eet 5

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

这种0作为Unicode 0的处理符合维基百科的描述:

1992年,IANA注册了字符映射ISO_8859-1:1987,更常见的是其首选的MIME名称ISO-8859-1(请注意ISO 8859-1的额外连字符),ISO 8859-1的超集,在互联网上使用.此映射将C0和C1控制字符分配给未分配的代码值,从而通过每个可能的8位值提供256个字符.

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

0:最初用于允许在纸带上留下间隙进行编辑.稍后用于在可能需要终端处理一段时间的代码之后进行填充(例如,在打印终端上的回车或换行).现在经常用作字符串终止符,尤其是在C编程语言中.

示例代码:

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
    }
}
Run Code Online (Sandbox Code Playgroud)