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

4
我不确定该问题是否有意义。我正在转换从ID3标记获取的字节数组并将其转换为字符串。ID3标签中的大多数文本帧使用ISO 8859-1编码,但这取决于帧。无论如何,如果您查找ISO 8859-1代码中的0x00是无效的。
要使情况更加复杂,由于程序员错误或格式不良,一些字符串以0x00结尾,而其他字符串则不是。
使用ISO 8859-1编码将一系列字节转换为字符串时,您是否必须手动检查字符串的末尾是否为空?或者编码对象通过其用于首次转换的任何方法正确处理null?此外,是否存在某种函数可以规范化或“修复”空终止字符串?
当您尝试显示这些字符串时,它们不能正确显示。
我在此特定项目中使用C#。关于ID3标签的一些额外信息:ID3规格

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

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

如果你正在转换数据,那么你将会把数据从一种表示方式转化为另一种。你已经表明了你想转换成什么样子,但是你没有说你想要从什么样子进行转换。 - David Heffernan
2个回答

5
如果您使用Encoding.GetEncoding(28591),它只会将一个字节0转换为Unicode U+0000。编码通常假定它们必须转换所有的字节-它们不会查找终止符。
这种0被视为Unicode 0的处理方式符合Wikipedia描述
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
    }
}

0

令人高兴的是,ASCII、ISO-8859-1和Unicode都在0..127的代码点上达成了一致。因此,您的字符'\0'在ASCII、ISO-8859-1和UTF-8中的编码将完全相同。

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


好的。是的,0x00会被转换为'\0'。但是,在转换一系列以0x00结尾的字节时,应该包括空值吗?还是这会导致字符串有两个空终止符?例如,C#是否会在字符串末尾添加另一个空终止符?无论如何,在我显示这样的字符串之后,它都会破坏所有其他字符串的显示。 - user838293
这完全取决于您是否使用将字节字符串解释为以空字符结尾的字符字符串的函数。请查看您的文档。我不了解C#,但在C中,字符串函数会停止在空字节处,而在C++中,字符串类对字节的值完全不关心。 - Kerrek SB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接