C# 空终止符是文本编码的一部分吗?

C# 空终止符是文本编码的一部分吗?,c#,character-encoding,null-terminated,C#,Character Encoding,Null Terminated,我试图从字节数组中读取以null结尾的字符串;函数的参数是编码 string ReadString(Encoding encoding) 例如,以下编码中的“foo”是: UTF-32: 66 00 00 00 6f 00 00 00 6f 00 00 00 UTF-8: 66 6f 6f UTF-7: 66 6f 6f 2b 41 41 41 2d 如果我将所有字节复制到一个数组中(读取到空终止符),并将该数组传递到encoding.GetString(),它将不起作用,因为如果字符串

我试图从字节数组中读取以null结尾的字符串;函数的参数是编码

string ReadString(Encoding encoding)
例如,以下编码中的“foo”是:

UTF-32: 66 00 00 00 6f 00 00 00 6f 00 00 00
UTF-8:  66 6f 6f
UTF-7:  66 6f 6f 2b 41 41 41 2d
如果我将所有字节复制到一个数组中(读取到空终止符),并将该数组传递到
encoding.GetString()
,它将不起作用,因为如果字符串是UTF-32编码的,我的算法将到达第二个字节后的“空终止符”

所以我有一个双重问题:空终止符是编码的一部分吗?如果不是,我如何逐个字符解码字符串并检查以下字节的空终止符

提前谢谢

(也欢迎您提出建议)

编辑:

如果“foo”以null结尾,并采用utf-32编码,那么会是哪一个

1. 66 00 00 00 6f 00 00 00 6f 00 00 00   00
2. 66 00 00 00 6f 00 00 00 6f 00 00 00   00 00 00 00

空终止符不是编码的一部分,但某些编程语言(如.NET中的C.System.string)使用的字符串表示形式是以字符串长度作为前缀的32位整数,并且不是空终止的。内部System.String始终为UTF-16,但您可以使用编码输出不同的表示形式


第二部分。。。使用System.Text中的类,如UTF8Encoding和UTF32Encoding来读取字符串。您只需根据您的参数选择正确的一个…

这对我来说似乎很好(示例来自从字节数组读取以unicode结尾的空字符串的实际代码):


空终止符不是字符串的“逻辑”部分;它不被认为是有效载荷。它在C/C++中广泛用于指示字符串的结束位置


已经说过,可以使用嵌入\0的字符串,但必须小心确保该字符串不会被截断。例如,std::string与嵌入的\0没有问题。但是,如果执行c_str()而不考虑报告的长度(),则字符串将被截断

除非字符串数据以null开头,然后在其后包含一些垃圾。对于您的编辑,它将是“2.66 00 00 6f 00 00 00 6f 00 00 00 00”,因为utf 32将每个字符(甚至\0)视为一个4字节数组。这里有一个使用c#interactive的快速测试:
 //trim null-termination from end of string
 byte[] languageId = ...
 string language = Encoding.Unicode.GetString(languageId, 
                                              0,
                                              languageId.Length).Trim('\0');