空字节为`print`而不是`strlen`停止,为什么?

con*_*com 5 string nul dart

我正在玩Dart琴弦并注意到这一点:

print("\x00nullbyte".length);
print("\x00nullbyte");
Run Code Online (Sandbox Code Playgroud)

如果你运行它,你会发现长度是9,包括空字节.但是没有输出.

在编程方面,相信Google工程师比我自己更多,我认为这可能是有原因的.会是什么呢?

lrn*_*lrn 5

Dart 字符串的长度为 9,包含所有九个代码单元。NUL 字符在 Dart 字符串中完全有效。但它们在 C 字符串中无效,它们标记字符串的结尾。打印时,字符串最终会转换为C字符串以调用系统库的输出函数。此时,系统库只看到 NUL 字符并且不打印任何内容。

尝试:

main() { print("ab\x00cd"); }  // prints "ab".
Run Code Online (Sandbox Code Playgroud)

String.length 函数完全作用于 Dart String 对象,并且不经过 C strlen 函数。它不受 C 的限制的影响。

可以说,Dart 打印功能应该检测 NUL 字符并打印字符串的其余部分。

  • 不可能将所有可能的 ASCII 或 UTF-8 字符串存储在以 null 结尾的字符串中,因为 NUL 字符的编码是零字节。但是,通常将不包含 NUL 字符的 ASCII 或 UTF-8 子集存储在以 null 结尾的字符串中。某些系统使用“修改的 UTF-8”,它将 NUL 字符编码为两个非零字节(0xC0、0x80),从而允许存储所有可能的字符串。 (2认同)