null终止符是文本编码的一部分吗?

时间:2010-12-03 03:31:03

标签: c# character-encoding null-terminated

我正在尝试从字节数组中读取一个以空字符结尾的字符串;该函数的参数是编码。

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编码,我的算法将达到第二个字节后面的“null终结符”。

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

提前致谢

(建议也表示赞赏)

编辑:

如果“foo”为空终止并且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

3 个答案:

答案 0 :(得分:1)

Null终结符不是编码的一部分,而是某些编程语言使用的字符串表示形式,例如C.在.NET中,System.String以字符串长度作为32位整数作为前缀而不是null-终止。内部System.String总是UTF-16,但您可以使用编码输出不同的表示。

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

答案 1 :(得分:1)

这似乎对我有用(来自实际代码的示例,它从字节数组中读取unicode,空终止字符串):

 //trim null-termination from end of string
 byte[] languageId = ...
 string language = Encoding.Unicode.GetString(languageId, 
                                              0,
                                              languageId.Length).Trim('\0'); 

答案 2 :(得分:1)

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

说过你可以拥有嵌入式\ 0的字符串,但是你必须小心确保字符串不会被截断。例如,std :: string对嵌入式\ 0没有问题。但是,如果执行c_str()而不考虑报告的长度(),则您的字符串将显示为截断。