我想将带有不可打印字符(反斜杠,左箭头,右箭头等)的字符串翻译成java编程中的可打印字符串。
例如 -
输入字符串=“rn -r \ b \ b \ b \ b -r [K \ b \ b \ bm -r \ b \ b \ b”
输入字符串的字节数组= [114,110,32,45,114,8,8,8,8,32,45,114,27,91,75,8,8,8,109,32,45,114,8,8,8 ]
输出字符串应为=“rm -r”
如何将此字符串翻译成可打印的字符串?
答案 0 :(得分:1)
如果您的意思是删除不可打印的字符
System.out.println("rn -r\b\b\b\b -r[K\b\b\bm -r\b\b\b".replaceAll("\\P{Print}", ""));
输出
rn -r -r[Km -r
更新
此版本维护游标并支持退格键,左箭头和右箭头
String s = "rn -r\b\b\b\b -r[K\b\b\bm -r\b\b\b";
StringBuilder sb = new StringBuilder();
int cursor = 0;
for (char c : s.toCharArray()) {
if (c == '\b') {
if (cursor > 0) {
sb.deleteCharAt(--cursor);
}
} else if (c == 37) { // left arrow
if (cursor > 0) {
cursor--;
}
} else if (c == 39) { // right arrow
if (cursor < sb.length()) {
cursor++;
}
} else if (!Character.isISOControl(c)) {
sb.insert(cursor++, c);
}
}
System.out.println(sb);
打印r -m
。
它与您的rm -r
不同,但我认为我的是正确的
答案 1 :(得分:1)
如果您想删除不可打印的字符,可以按照以下步骤进行操作。
String input = "rn -r\b\b\b\b -r[K\b\b\bm -r\b\b\b";
String output = input.replaceAll("\\p{Cntrl}", "");
答案 2 :(得分:0)
要转换具有不可打印字符的字符串,请遍历字符串的字节数组表示形式,并将每个字符(1个字节)转换为其十六进制等效字符。
请记住,每个字节的整数表示范围为0-255,这意味着Hex等效值的范围为00到FF。因此,每个字节对应两个十六进制字符。
上面的逻辑给一个字符串一个Hex String,它总是包含可打印的字符(0,1,2..A,B ..,F)。