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

C# 将字节转换为ISO 8859-1编码时,空字节会发生什么情况?,c#,encoding,id3,iso-8859-1,C#,Encoding,Id3,Iso 8859 1,我不完全确定这个问题是否有意义。我正在转换取自ID3标记的字节数组,并将其转换为字符串。ID3标记中的大多数文本帧使用ISO 8859-1编码,但这取决于帧。在任何情况下,如果您查找ISO 8859-1代码中的0x00,则该代码无效 更复杂的是,可能是由于程序员错误,也可能是格式不好,有些字符串以0x00结尾,有些则不以0x00结尾 当使用ISO 8859-1编码将一系列字节转换为字符串时,您是否手动检查字符串的结尾以查看它是否为空?或者编码对象是否会通过它最初用来转换的任何方法正确地处理空值?

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

更复杂的是,可能是由于程序员错误,也可能是格式不好,有些字符串以0x00结尾,有些则不以0x00结尾

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

当您试图显示这些字符串时,它们不会正确显示

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

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

  • 编辑:我使用System.Text.Encoding.GetEncoding(“iso-8859-1”),后跟一个GetString调用

令人高兴的是,ASCII、ISO-8859-1和Unicode在0..127范围内的代码点上达成一致。因此,您的字符
'\0'
将以ASCII、ISO-8859-1和UTF-8进行相同的编码


如果您的程序为零字节分配了特殊的语义,您必须适当地处理它。

如果您使用
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的超集,用于互联网。此映射将分配给未分配的代码值,从而通过每个可能的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
    }
}

如果要转换,则将数据从一种表示转换为另一种表示。你已经说了你要转变成什么。你是从什么转变过来的。你没那么说,好吧。因此,是0x00被转换为“\0”。但是,在转换一系列字节(以0x00结尾)时,是否应包括null?或者这会导致一个字符串有2个空终止符吗?例如,C#会在字符串的末尾添加另一个空终止符吗?在任何情况下,在我显示这样一个字符串之后,所有其他字符串的显示都会出错。这完全取决于您使用的函数是否将字节字符串解释为以null结尾的字符串。检查您的文档。我不知道C,但是在C中,字符串函数在一个空字节上停止,而在C++中,string类对字节的值完全漠不关心。