按字节拆分字符串

Split a string by a byte

我有一个 String,里面有一些 ASCII 控制字符(即 RS (0x1e) 和 US (0x1f))。我在我的代码中定义了它们:

static public final byte RS  = 0x1E;
static public final byte US  = 0x1F;

稍后在我的代码中,我想使用这些字符拆分字符串:

String[] records = content.split(String.valueOf(RS));

但是,这不能正常工作。经过一番摆弄后,我发现这个

String[] records = content.split("\u001e");

确实有效,但在那种情况下,我必须记住代码。我在其他部分也使用了 RS 静态字节,所以只是改变它不是一个真正的选择。我当然可以创建一个 RS_STRING 之类的东西,但这意味着双重工作。

有什么好的解决方案吗?

将角色声明为 char 而不是 byte 为我修复了它 - 以下工作正常:

char RS  = 0x1E;
String s = new String(new char[]{'d', RS, 'e'});
System.out.println(s.split(String.valueOf(RS)).length); //Prints 2

但是,使用字节作为类型会导致失败:

byte RS  = 0x1E;
String s = new String(new char[]{'d', (char)RS, 'e'});
System.out.println(s.split(String.valueOf(RS)).length); //Prints 1

如果您需要在代码的其他部分引用它,您当然可以将 char 转换回 byte

问题是你使用了String.valueOf(),因为没有String.valueOf(byte).

相反,字节会悄无声息地加宽为 int 并调用 String.valueOf(int)。并且此方法returns int 的十进制字符串表示形式。

这就是为什么将 RS 声明为 char 的建议修复了它,String.valueOf(char) 确实符合您的预期(给出一个包含该 char 的字符串)。

您也可以在转换为字符串表示形式时添加显式强制转换:String.valueOf((char) RS) 并保留声明为字节的 Costant RS。