您可以在字符串中存储一个字节,但这不是一个好主意。您不能使用 UTF-8,因为这会管理字节,但更快、更有效的方法是使用 ISO-8859-1 编码或纯 8 位。最简单的方法是使用
String s1 = new String(data, 0);
或者
String s1 = new String(data, "ISO-8859-1");
正如 Jon Skeet 所指出的,来自Wikipedia 上的 UTF-8,这些编码在标准下无效。它们在 Java 中的行为各不相同。DataInputStream 将它们视为前三个版本相同,接下来的两个抛出异常。Charset 解码器默默地将它们视为单独的字符。
00000000 is \0
11000000 10000000 is \0
11100000 10000000 10000000 is \0
11110000 10000000 10000000 10000000 is \0
11111000 10000000 10000000 10000000 10000000 is \0
11111100 10000000 10000000 10000000 10000000 10000000 is \0
这意味着如果您在 String 中看到 \0,则无法确定原始 byte[] 值是什么。DataOutputStream 使用第二个选项来与将 \0 视为终止符的 C 兼容。
BTW DataOutputStream 不知道代码点,因此以 UTF-16 和 UTF-8 编码写入高代码点字符。
0xFE 和 0xFF 无效地出现在一个字符中。值 0x11000000+ 只能出现在字符的开头,不能出现在多字节字符内。