如何在java中翻译不可打印字符的字符串

时间:2012-12-27 05:22:29

标签: java string

我想将带有不可打印字符(反斜杠,左箭头,右箭头等)的字符串翻译成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”

如何将此字符串翻译成可打印的字符串?

3 个答案:

答案 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)。