按字节拆分字符串
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。
我有一个 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。